2 minute read

동적 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에 대한 반복 처리를 제공

Categories:

Updated: