티스토리 뷰
[MyBatis] 동적 쿼리 SQL (if, choose, when,set , foreach ..)
JoonPyo-Hong 2021. 7. 20. 16:10MyBatis에서는 SQL을 동적으로 처리 할 수 있다.
저장 프로시저(stored procedure)를 활용해도 되지만 MyBatis에서 제공하는 기능을 사용해보자.
if
<select id = "search" resultType="MainDTO" parameterType="Integer">
select * from search_list where seq = #{seq}
<if test="title != title">
and title = #{title}
</if>
<if test="contents != contents">
and contents = #{contents}
</if>
</select>
if의 조건에 맞지 않으면
select * from search_list where seq = #{seq}
title 값이 있으면
select * from search_list where seq = #{seq} and title = #{title}
title 과 contents 값이 있으면
select * from search_list where seq = #{seq} and title = #{title} and contents = #{contents}
choose, when, otherwise
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
select * from search_list where gubn = 'SE'
<choose>
<when test="seq != null">
and seq = #{seq}
</when>
<when test="title != null and contents != null">
and title = #{title} and contents = #{contents}
</when>
<otherwise>
AND seq = 1
</otherwise>
<choose>
</select>
if와는 다르게 자바에서의 switch 구문과 유사하다.
seq, title, cotnets 값이 모두 있을 때
첫번째 when에 걸려서 select * from where search_list gubn = 'SE' and seq = #{seq} 가 된다.
모두 해당되지 않으면 otherwise에 걸린다.
foreach
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
select * from search_list where seq in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach는 동적 SQL에서 반복처리를 해준다.
collection 값으로 Map이나 배열객체와 더불어 List, Set등과 같은 반복가능한 객체를 전달할 수 있다.
index : 현재 몇번째 반복인지
open : 시작 문자 (
close : 끝 문자 )
separator : 구분자 ,
select * from search_list where seq in (1, 2, 3 .. )
where, trim, set
where
<select id = "search" resultType="MainDTO" parameterType="Integer">
select * from search_list
<choose>
<when test ="seq !null">
where seq = #{seq}
<when>
<when test ="contents !null">
where contents = #{contents}
<when>
</choose>
</select>
where은 choose, when, otherwise 내부에서 반복되는 where을 생략해 줄 수 있다.
<select id = "search" resultType="MainDTO" parameterType="Integer">
select * from search_list
<where>
<choose>
<when test ="seq !null">
seq = #{seq}
<when>
<when test ="contents !null">
contents = #{contents}
<when>
</choose>
</where>
</select>
trim
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
select * from search_list where
<if test="title != title">
title = #{title}
</if>
<if test="contents != contents">
and contents = #{contents}
</if></select>
위의 쿼리에서 어떤 조건에도 해당 되지 않는다면 (title = null, cotents =null)
select * from search_list where
오류가 발생 할 것이다.
<select id = "search" resultType="MainDTO" parameterType="java.util.HashMap">
select * from search_list
<trim prefix="WHERE" prefixOverrides="AND | OR ">
<if test="title != title">
title = #{title}
</if>
<if test="contents != contents">
and contents = #{contents}
</if>
<trim>
</select>
prefix : 쿼리 완성 후 trim 내부에 내용이 있다면 가장 앞에 쓰일 내용
suffix : 쿼리 완성 후 trim 내부에 내용이 있다면 가장 뒤에 쓰일 내용
prefixOverrides : 쿼리 완성 후 trim 내부에 맨 앞에 해당 문자열이 있다면 지움
suffixOverrides : 쿼리 완성 후 trim 내부에 맨 뒤에 해당 문자열이 있다면 지움
set
<update id = "update" parameterType="java.util.HashMap">
update search_list
<set>
<if test="title != title">
title = #{title}
</if>
</set>
where seq = #{seq}
</update>
set은 update문에서 쓰인다.
update 테이블 set 열 = '변경할값' WHERE 조건 에서 set에 해당된다.
set, trim 활용 - prefix, suffixOverrides 사용
<update id = "update" parameterType="java.util.HashMap">
update search_list
<trim prefix="SET" suffixOverrides=",">
<if test="title != title">
title = #{title},
</if>
<if test="contents != contents">
title = #{contents},
</if>
</trim>
where seq = #{seq}
</update>