[servlet-context.xml에서 DB접속설정 설정을 import로 해줄때]
<!--src/main/resources/config/mybatis.xml -->
<beans:import resource="classpath:config/mybatis.xml"/>
src/main/resources에 config폴더 추가
->폴더에서 spring Bean configuration File로 생성
-> 파일생성하면서 next해서 beans랑 mybatis spring 추가
-> DB접속 설정 , mybatis감지 가져와서 beans는 지워주기
[경로 축약]
1. mybatis.xml의 DB접속 설정에 추가
<property name="configLocation" value="classpath:/config/aliase.xml"/>
2.aliase.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- DTO의 경로를 축약시켜주는 설정 -->
<!-- alias="사용할 이름" type="클래스경로" -->
<configuration>
<typeAliases>
<typeAlias alias="member" type="com.spring.main.dto.MemberDTO"/>
</typeAliases>
</configuration>
[쿼리를 로그로 찍어주기]
1. Maven 라이브러리 log4jdbc 추가
2. mybatis.xml에 driverClassName이랑 url 변경
<!-- DataSource작성(접속정보) -->
<!-- log4jdbc 사용을 위해서 driverClassName을 변경해줘야한다. -->
<!-- url에도log4jdbc추가 -->
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
<property name="url" value="jdbc:log4jdbc:oracle:thin:@gdportal.iptime.org:1521:xe"/>
<property name="username" value="C##TEAM4_MM"/>
<property name="password" value="pass"/>
</bean>
3.src/main/resources/log4j.xml 에 logger추가
<!-- SQL LOGGER(볼 내용과 보지 않을 내용 설정) -->
<!-- 실행쿼리+걸린시간 / additivity="false"로 안하면 같은로그가 2번 찍힘 -->
<logger name="jdbc.sqltiming" additivity="false">
<level value="INFO"/>
<appender-ref ref="console"/>
</logger>
<!-- 실행쿼리+결과값 -->
<logger name="jdbc.resultset" additivity="false">
<level value="OFF"/>
<appender-ref ref="console"/>
</logger>
<!-- 쿼리실행시 모든 정보를 출력 -->
<logger name="jdbc.audit" additivity="false">
<level value="OFF"/>
<appender-ref ref="console"/>
</logger>
<!-- 쿼리실행전후 커넥션 상태 -->
<logger name="jdbc.connection" additivity="false">
<level value="INFO"/>
<appender-ref ref="console"/>
</logger>
<!-- 실행쿼리 -->
<logger name="jdbc.sqlonly" additivity="false">
<level value="OFF"/>
<appender-ref ref="console"/>
</logger>
<mapper namespace="com.spring.main.dao.MemberDAO">
<!-- if else를 대체하는 방법
<insert id="join" parameterType="member">
INSERT INTO member(id,pw,name,phone,email)
<choose>
<when test="!email.equals('')">
VALUES(#{id},#{pw},#{name},#{phone},#{email})
</when>
<otherwise>
VALUES(#{id},#{pw},#{name},#{phone},'없음')
</otherwise>
</choose> </insert> -->
<!-- email이 들어 왔을 경우 넣고, 안들어왔으면 '없음'으로 INSERT -->
<!-- 특정조건에 대해서 각 if처리 -->
<insert id="join" parameterType="member">
INSERT INTO member(id,pw,name,phone,email)
<if test="!email.equals('')">
VALUES(#{id},#{pw},#{name},#{phone},#{email})
</if>
<if test="email.equals('')">
VALUES(#{id},#{pw},#{name},#{phone},'없음')
</if>
</insert>
<!--문자열 합치는 방식
[oracle]'%'||#{keyword}||'%'
[mysql] CONCAT('%',#{keyword},'%')
[ms-sql]'%'+#{keyword}+'%' -->
<select id="list" parameterType="hashMap" resultType="member">
SELECT * FROM member
<where>
<if test="!keyword.equals('') and opt == 'id'">id LIKE '%'||#{keyword}||'%'</if>
<if test="!keyword.equals('') and opt == 'name'">name LIKE '%'||#{keyword}||'%'</if>
<if test="!keyword.equals('') and opt == 'email'">email LIKE '%'||#{keyword}||'%'</if>
</where>
</select>
<!-- <set>을 쓰지 않으면 컴마에 의한 오류발생 -->
<update id="update" parameterType="hashMap">
UPDATE member
<set>
<if test="!pw.equals('')">pw=#{pw},</if>
<if test="!name.equals('')">name=#{name},</if>
<if test="!email.equals('')">email=#{email}</if>
</set>
WHERE id=#{id}
</update>
<!-- SELECT * FROM member WHERE name='김지훈' OR name='고길동' -->
<!-- collection="들어오는 컬렉션 프레임워크(parameterType)"
item="반복되는것을 뭘로 받을지"
separator="item사이에 들어가는 값" -->
<!-- <select id="multi" parameterType="list" resultType="member">
SELECT * FROM member WHERE
<foreach collection="list" item="item" separator="OR">
name = #{item}
</foreach>
</select> -->
<!-- SELECT * FROM member WHERE name IN('김지훈','고길동') -->
<select id="multi" parameterType="list" resultType="member">
SELECT * FROM member WHERE name IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
- mapper에서 쿼리문을 실행할때 if나 foreach로 동적쿼리를 사용할 수 있다.