본문 바로가기
IT/SQL

Mybatis where 1=1 사용 이유와 다른 방법

by 봉즙 2020. 7. 3.

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

댓글