[MyBatis] 동적 쿼리

검색 조건에 따라 비교하면서 동적 쿼리를 사용하는 방법에 대해 알아보겠습니다.

MyBatis와 데이터베이스는 Oracle을 사용하였습니다.

조건문

조건문에는 단일(if), 다중(choose, when, otherwise) 조건문이 있습니다.

1. 단일 조건문

1
2
3
4
5
6
7
8
9
<select id="findBySearch" resultType="Sample" parameterType="SearchParam">
SELECT *
FROM TB_SAMPLE
WHERE
column1 = #{parameter1}
<if test="parameter2 != null and parameter2 != ''">
AND column2 LIKE %'||#{parameter2}||'%'
</if>
</select>

2. 다중 조건문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="findBySearch" resultType="Sample" parameterType="SearchParam">
SELECT *
FROM TB_SAMPLE
WHERE
column1 = #{parameter1}
<choose>
<when test="parameter2 != null and parameter2 == ''">
AND column2 = #{parameter2}
</when>
<otherwise>
AND column3 = #{parameter3}
</otherwise>
</choose>
</select>

비교 형식

1
2
3
4
5
6
7
8
9
<!-- 문자열 비교 -->
<if test="parameter != null and (parameter eq 'all'.toString())"></if>
<if test="!parameter.equals('all')"></if>

<!-- 공백 비교 -->
<if test="parameter == ' '"></if>

<!-- 값 비교 -->
<if test="uesYn == 'Y'"></if>

for 문

foreach를 사용하여 조건을 만들 수 있습니다.

1
2
3
4
5
6
7
8
<select id="findBySearch" resultType="Sample" parameterType="SearchParam">
SELECT *
FROM TB_SAMPLE
WHERE
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
column1 IN ${item}
</foreach>
</select>

where 절

1
2
3
4
5
6
7
8
9
10
11
12
<select id="findBySearch" resultType="Sample" parameterType="SearchParam">
SELECT *
FROM TB_SAMPLE
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="parameter1 != null and parameter1 != ''">
AND column1 = #{parameter1}
</if>
<if test="parameter2 != null and parameter2 != ''">
AND column2 = #{parameter2}
</if>
</trim>
</select>
Share