trim

mybatis 이용해서 동적으로 쿼리를 사용하다 보면

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT * 
FROM TABLE_NAME 
WHERE 1=1
	<if test="a != null || a!=''">
		AND a = #{a}
	</if>
	<if test="b != null || b!=''">
		AND b = #{b}
	</if>
	<if test="c != null || c!=''">
		AND c = #{c}
	</if>
ORDER BY a;

위와 같이 AND나 OR 을 처리하기 위해서 1=1 과 같은 조건을 사용하는 경우가 있다.

이를 방지하기 위해서 mybatis의 trim을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT *
FROM TABLE_NAME
	<trim prefix="WHERE" prefixOverrides="AND">
		<if test="a != null || a!=''">
			a = #{a} -- 맨앞의 경우 항상 AND가 제거 되기 때문에 사용하지 않았다.
		</if>
		<if test="b != null || b!=''">
			AND b = #{b}
		</if>
		<if test="c != null || c!=''">
			AND c = #{c}
		</if>
	</trim>
ORDER BY a;

SELECT *
FROM TABLE_NAME
WHERE
	<trim prefixOverrides="AND"">
		<if test="a != null || a!=''">
			a = #{a}
		</if>
		<if test="b != null || b!=''">
			AND b = #{b}
		</if>
		<if test="c != null || c!=''">
			AND c = #{c}
		</if>
	</trim>
ORDER BY a;

prefix는 앞에 where을 생성해주며 prefixOverrides는 첫번째 AND를 제거해준다

a에서는 항상 앞에 AND가 붙지 않기 때문에 사용하지 않았으며 a가 null인 경우 b에 있는 AND가 제거된다.

“AND OR” 을 사용하면 두가지 모두 제거하는 것이 가능하다.

suffixOverrides, suffix도 마찬가지로 사용할 수 있다.