mybatis 이용해서 동적으로 쿼리를 사용하다 보면
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을 사용한다.
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도 마찬가지로 사용할 수 있다.
'IT > SQL' 카테고리의 다른 글
2022-07-07-explain (0) | 2023.02.27 |
---|---|
Mybatis #{} , ${} 차이 (0) | 2020.07.07 |
Oracle 테이블 정보 조회 (0) | 2020.07.02 |
테이블 전체 삭제 (0) | 2019.07.30 |
ADVANCED SQL (0) | 2019.06.08 |
댓글