Mybatis - 동적 SQL
동적 SQL
- 동적 SQL
- 실행 시에 쿼리문이 만들어지는 것이라고 생각하면 됨(강사님 피셜)
지원 구문 종류
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if 구문
- 동적 쿼리를 구현할 때 가장 기본적으로 사용되는 구문
- 특정 조건을 만족할 경우 안의 구문을 쿼리에 포함
<!-- 사용 예시 -->
<select id="selectAll" parameterType="map" resultMap="boardListResultMap">
SELECT B.NO,
B.TITLE,
M.ID,
...
FROM BOARD B
JOIN MEMBER M ON(B.WRITER_NO = M.NO)
WHERE B.STATUS = 'Y'
<if test="writer != null">
AND M.ID LIKE '%' || #{writer} || '%'
</if>
</select>
다중 if 구문
- 필요로 하는 조건이 1개 이상일 시 if 구문을 여러 개 사용 가능
<!-- 사용 예시 -->
<select id="selectAll" parameterType="map" resultMap="boardListResultMap">
SELECT B.NO,
B.TITLE,
M.ID,
...
FROM BOARD B
JOIN MEMBER M ON(B.WRITER_NO = M.NO)
WHERE B.STATUS = 'Y'
<if test="writer != null">
AND M.ID LIKE '%' || #{writer} || '%'
</if>
<if test="title != null">
AND B.TITLE LIKE '%' || #{title} || '%'
</if>
<if test="content != null">
AND B.CONTENT LIKE '%' || #{content} || '%'
</if>
</select>
choose, when, otherwise 구문
- 자바의 if-else, switch, JSTL의 choose 구문과 유사하며 주어진 구문 중 한 가지만을 수행하고자 할 때 사용
<!-- 사용 예시 -->
<choose>
<when test="writer != null">
AND M.ID LIKE '%' || #{ writer } || '%'
</when>
<when test="title != null">
AND B.TITLE LIKE '%' || #{ title } || '%'
</when>
<when test="content != null">
AND B.CONTENT LIKE '%' || #{ content } || '%'
</when>
<otherwise>
<!-- when 조건이 전부 만족하지 않을 경우 -->
</otherwise>
</choose>
trim, where, set 구문
- trim : 쿼리 구문의 특정 부분 제거
- where : 기존 쿼리의 WHERE 절을 동적으로 구현용
- set : 기존의 UPDATE SET 절을 동적으로 구현
whred
- 단순히 WHERE만 추가
- 태그 안의 내용이 AND/OR로 시작할 경우 AND/OR 제거
<!-- 사용 예시 -->
<where>
<if test="writer != null">
M.ID LIKE '%' || #{writer} || '%'
</if>
<if test="title != null">
AND B.TITLE LIKE '%' || #{title} || '%'
</if>
<if test="content != null">
AND B.CONTENT LIKE '%' || #{content} || '%'
</if>
AND B.STATUS = 'Y'
-
trim을 통한 where
- prefix : 처음 시작할 단어
- prefixOverrides : 제거해야 할 단어
<!-- 사용 예시 -->
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="writer != null">
M.ID LIKE '%' || #{writer} || '%'
</if>
<if test="title != null">
AND B.TITLE LIKE '%' || #{title} || '%'
</if>
<if test="content != null">
AND B.CONTENT LIKE '%' || #{content} || '%'
</if>
AND B.STATUS = 'Y'
</trim>
-
set
- UPDATE 하고자 하는 컬럼을 동적으로 포함시키기 위해 사용
- SET 키워드를 붙이고 불필요한 콤마를 제거
<!-- 사용 예시 -->
UPDATE BOARD
SET
<if test="title != null">
TITLE = #{ title },
</if>
<if test="content != null">
CONTENT = #{ content },
</if>
<if test="originalFileName != null">
ORIGINAL_FILENAME = #{ originalFileName },
</if>
<if test="renamedFileName != null">
RENAMED_FILENAME = #{ renamedFileName },
</if>
MODIFY_DATE = SYSDATE
WHERE NO = #{ no }
-
trim을 통한 set
- WHERE와 흡사하나 suffixOverrides 속성을 콤마(,)로 설정하여 구문의 마지막에 제거할 값을 명시
- prefix : 쿼리문 앞에 붙여넣을 구문
- suffixOverrides : 마지막 제거할 특정 문자
<!-- 사용 예시 -->
<trim prefix="SET" suffixOverrides=",">
<if test="title != null">
TITLE = #{ title },
</if>
<if test="content != null">
CONTENT = #{ content },
</if>
<if test="originalFileName != null">
ORIGINAL_FILENAME = #{ originalFileName },
</if>
<if test="renamedFileName != null">
RENAMED_FILENAME = #{ renamedFileName },
</if>
MODIFY_DATE = SYSDATE
</trim>
WHERE NO = #{ no }
foreach 구문
- 동적 쿼리를 구현할 때 collection에 대한 반복 처리를 제공