MyBatis trim기능을 활용하여 sql 오류를 줄여봅시다.
SELECT COLUMN1
, COLUMN2
, COLUMN3
FROM TABLE
WHERE PK_COLUMN1 = #{key1}
AND (
PK_COLUMN2 = #{orKey1}
OR PK_COLUMN3 = #{orKey2}
)
이라는 코드가 존재할때
orKeys1, orKeys2의 값이 없다면 오류가 발생할겁니다.
SELECT COLUMN1
, COLUMN2
, COLUMN3
FROM TABLE
WHERE PK_COLUMN1 = #{key1}
AND (
)
이를 방지하고자 MyBatis에서는 trim을 사용하여 동적으로 SQL을 구현할 수 있도록 하였습니다.
SELECT COLUMN1
, COLUMN2
, COLUMN3
FROM TABLE
WHERE PK_COLUMN1 = #{key1}
OR PK_COLUMN2 = #{orKey1}
OR PK_COLUMN3 = #{orKey2}
<trim prefix="AND (" prefixOverrides="OR" suffix=")">
<trim></trim> 안에 쿼리가 존재한다면 AND( 와 ) 가 자동으로 만들어지게됩니다.
prefixOverrides="OR"은 맨앞에 OR연산자가 존재한다면 OR 연산자를 지워버리게 됩니다.
orKeys2의 값만 들어왔을경우
OR PK_COLUMN3 = #{orKeys2} 가 되는게 아니라 맨 앞 OR 연산자를 없애버리므로
PK_COLUMN3 = #{orKeys2}가 됩니다.
반대로 끝의 문자열을 지우고 싶다면
suffixOverrides을 사용하면 됩니다.
주로 UPDATE문에 사용되는데요
UPDATE [TABLE] |* ==> *| UPDATE [TABLE]
SET |* ==> *| SET
COLUMN1 = #{data1}, |* ==> *| COLUMN1 = #{data1},
COLUMN2 = #{data2}, |* ==> *| COLUMN2 = #{data2},
COLUMN3 = #{data3}, |* ==> *| COLUMN3 = #{data3},
COLUMN4 = #{data4}, |* ==> *| COLUMN4 = #{data4},
WHERE PK_COLUMN = #{pkKey} |* ==> *| WHERE PK_COLUMN = #{pkKey}
<if>를 통해 입력된값만 update를 하고 싶은데 마지막 쉼표(,) 때문에 오류가 나게됩니다.
이처럼 마지막 쉼표(,)를 제거하기 위해서 suffixOverrides를 사용하게됩니다.
UPDATE [TABLE] |* ==> *| UPDATE [TABLE]
|* ==> *| SET
COLUMN1 = #{data1}, |* ==> *| COLUMN1 = #{data1},
COLUMN2 = #{data2}, |* ==> *| COLUMN2 = #{data2},
COLUMN3 = #{data3}, |* ==> *| COLUMN3 = #{data3},
COLUMN4 = #{data4}, |* ==> *| COLUMN4 = #{data4} /* 쉼표(,)가 없어집니다. */
WHERE PK_COLUMN = #{pkKey} |* ==> *| WHERE PK_COLUMN = #{pkKey}
제 글이 코딩하는데 도움이 되면 좋겠습니다 :)
저도 잘 모르지만 제가 아는 만큼 써보려고 합니다 ㅎㅎ
이상 MyBatis trim 사용법이였습니다.