MyBatis의 동적 SQL 기능을 사용하면 하나의 SQL문으로 여러 케이스를 처리할 수 있다. 예를 들어 정렬 조건에 따라 ORDER BY 절을 바꿔야 하거나 검색 조건에 따라 WHERE 절을 변경해야 할 경우 동적 SQL 기능을 이용하면 자동으로 변경되는 SQL문을 만들 수 있다.
<if test="조건">SQL</if>
조건이 참일 경우 SQL문을 반환한다.
<choose>
<when test="조건1">SQL</when>
<when test="조건2">SQL</when>
<otherwise>SQL</otherwise>
<choose>
검사할 조건이 여러개일 경우 사용|
자바의 if-else문과 유사하다.
일치하는 조건이 없으면 <otherwise>
의 SQL이 반환된다.
<where>
<if test="조건1">SQL</if>
<if test="조건2">SQL</if>
</where>
SQL문의 WHERE절을 만들때 사용한다.
<where>
안의 조건식에서 일치하는 조건이 있으면 WHERE절을 만들어 반환하고 없으면 만들지 않는다.
<trim prefix="접두어" prefixOverrides="문자열|문자열">
<if test="조건1">SQL</if>
<if test="조건2">SQL</if>
</trim>
조건에 따라 SQL이 반환되면 SQL문의 앞부분에서 prefixOverrides에 지정된 문자열과 일치하는 문자열을 제거하고 prefix로 지정한 접두어를 붙인다.
<set>
<if test="조건1">SQL</if>
<if test="조건2">SQL</if>
</set>
UPDATE문의 SET절을 만들때 사용한다.
<set>
안의 조건식에서 일치하는 조건이 있으면 SET절을 만들어 반환하고 없으면 만들지 않는다.
SET절의 항목이 여러 개일 경우 자동으로 콤마(,)를 붙인다.
<foreach
item="항목"
index="인덱스"
collection="목록"
open="시작문자열"
close="종료문자열"
separator="구분자">
</foreach>
목록형 데이터로 SQL문을 만들때 사용한다.
특히 IN(값, 값, ...) 조건을 만들때 편리하다.
item : 한 개의 항목을 가리키는 변수 이름 지정
index : 인덱스 값을 꺼낼때 사용할 변수 이름 지정
collection : java.util.List 구현체나 배열 객체 지정
open : 최종 반환값의 접두어 지정
close : 최종 반환값의 접미어 지정
separator : 구분자 문자열 지정
<bind name="변수명" value="값"/>
변수를 생성할때 사용
<when>
과 <if>
의 test 속성test 속성에는 조건을 검사하는 OGNL(Open-Graph Navigation Language) 기반 표현식이 온다.
OGNL은 자바 객체의 프로퍼티 값을 쉽게 꺼내고 할당하기 쉽도록 만든 표현식 언어이다.
<choose>
사용 예<select id="selectList" parameterType="map" resultMap="projectResultMap">
select PNO, PNAME, STA_DATE, END_DATE, STATE
from PROJECTS
order by
<choose>
<when test="orderCond == 'TITLE_ASC'">PNAME asc</when>
<when test="orderCond == 'TITLE_DESC'">PNAME desc</when>
<when test="orderCond == 'STARTDATE_ASC'">STA_DATE asc</when>
<when test="orderCond == 'STARTDATE_DESC'">STA_DATE desc</when>
<when test="orderCond == 'ENDDATE_ASC'">END_DATE asc</when>
<when test="orderCond == 'ENDDATE_DESC'">END_DATE desc</when>
<when test="orderCond == 'STATE_ASC'">STATE asc</when>
<when test="orderCond == 'STATE_DESC'">STATE desc</when>
<when test="orderCond == 'PNO_ASC'">PNO asc</when>
<otherwise>PNO desc</otherwise>
</choose>
</select>
<choose>
를 사용하여 파라미터 orderCond의 값에 따라 다른 정렬조건을 반환하도록 하는 예이다.
예를 들어 orderCond가 'STATE_ASC'이면 다음과 같이 동적 SQL문이 생성된다.
select PNO, PNAME, STA_DATE, END_DATE, STATE
from PROJECTS
order by STATE asc
<set>
사용 예<update id="update" parameterType="map">
update PROJECTS
<set>
<if test="title != null">PNAME=#{title},</if>
<if test="content != null">CONTENT=#{content},</if>
<if test="startDate != null">STA_DATE=#{startDate},</if>
<if test="endDate != null">END_DATE=#{endDate},</if>
<if test="state != null">STATE=#{state},</if>
<if test="tags != null">TAGS=#{tags},</if>
</set>
where PNO = #{no}
</update>
<set>
을 사용하여 update 호출 시 파라미터가 있는 컬럼만 SET절을 만들도록 하는 예이다.
예를 들어 startDate, endDate만 전달되면 다음과 같이 동적 SQL문이 생성된다.
update PROJECTS
SET STA_DATE = #{startDate},
END_DATE = #{endDate}
where PNO = #{no}