728x90
UPDATE 테이블_명
SET
<if test="param1 != null">
    param1 = #{param1} ,
</if>
<if test="param1 != null">
    param2 = #{param2} ,
</if>
<if test="param3 != null">
    param3 = #{param3} ,
</if>
WHERE
idx = #{idx}

이런 구조로 된 SQL문이 있었다.

당연히 마지막 ',' 때문에 에러가 발생한다.

 

WHERE이 저런 상황이라면 1=1을 추가해주면 되던데

SET은 1=1을 할 수 없었다.

++ 1=1도 찾아보니 성능상 좋지 않다고 한다.

 

이때 SET에 trim이라는 것을 사용해 보았는데, 아래와 같이 사용하면 된다.

UPDATE 테이블_명
<trim prefix="SET" suffixOverrides=",">
    <if test="param1 != null">
        param1 = #{param1},
    </if>
    <if test="param=2 != null">
        param=2 = #{param2},
    </if>
    <if test="param=3 != null">
        param=3 = #{param3},
    </if>
</trim>

 

trim의 옵션 prefix와 suffixOverrides는 이러한 기능이라고 한다.

prefix : trim 안에 있는 모든 문자열의 앞에 붙여줄 문자열
suffixOverrides : trim 안에 있는 모든 문자열의 조건문을 판별해서 문자열 맨 끝에서부터 하나 지워줄 문자열

 

 

 

 

참고

https://devfunny.tistory.com/11

728x90

'Server > Database' 카테고리의 다른 글

[Mybatis] #{}, ${}의 차이  (0) 2022.11.07
[MySQL] IntelliJ 테이블 복사  (0) 2022.09.15
[MySQL] auto increment 1로 변경하는 방법  (0) 2022.08.30
728x90

주로 #{} 이렇게 되어있는데 ${} 이렇게 되어있는 부분도 있어서 검색해보았다.

#{}와 ${}의 가장 큰 차이는 '', String이냐 아니냐의 차이인 것 같다.

 

#{}

String 형태로 주입되어 자동적으로 ''가 붙는 형태가 된다.

WHERE user_idx = #{user_idx}

예를 들면 위의 경우 출력되는 쿼리문은 WHERE user_idx = '2'의 형태가 된다.

쿼리 주입을 예방할 수 있어서 보안 측면에서 유리하다.

 

${}

String 형태가 아닌 주입되는 형태 그대로 출력된다.

쿼리 주입을 예방할 수 없어서 보안 측면에서 불리하다.

테이블 명, 칼럼 명을 전달할 때 사용한다. #{}의 경우 String 형태이기 때문에 ''가 붙어서 사용할 수 없다.

 

 

 

출처

https://logical-code.tistory.com/25

728x90
728x90

Target schema 지정 후 Import

728x90
728x90
ALTER TABLE [테이블 명] AUTO_INCREMENT = 1;
728x90

+ Recent posts