1. 동적 쿼리 : where
아래 예제는 악명높게 다양한 엘리먼트가 사용된 동적 SQL이다.
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
만약 어떤 조건에도 해당되지 않는다면?
아래와 같은 SQL이 만들어질 것이다.
SELECT * FROM BLOG
WHERE
두번째 조건에만 해당된다면?
아래와 같은 SQL이 만들어질 것이다.
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
이런 부분의 문제를 해결하기 위해 나타난 것이 where 엘리먼트이다.
where 엘리먼트는 태그에 의해 컨텐츠가 리턴되면 단순히 “WHERE”만을 추가한다.
게다가 컨텐츠가 “AND”나 “OR”로 시작한다면 그 “AND”나 “OR”를 지워버린다.
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
2. 동적 쿼리 : trim
where 엘리먼트가 기대한 것처럼 작동하지 않는다면 trim 엘리먼트를 사용할 수도 있다.
<!-- 아래 trim 구문은 where 구문과 동일하게 작용한다 -->
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
- prefix : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 앞에 붙여준다.
- suffix : 실행 될 쿼리의 <trim> 문 안에 쿼리 가장 뒤에 붙여준다.
- prefixOverrides : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 앞에 해당하는 문자들이 있으면 자동으로 지워준다.
- suffixOverrides : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 뒤에 해당하는 문자들이 있으면 자동으로 지워준다.
3. 동적 쿼리 : set
set은 update 구문에서 update 하고자 하는 컬럼을 동적으로 포함시키기 위해 사용될 수 있다.
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>