본문 바로가기
SQL/Mybatis Framework

[MyBatis] PK가 없으면 INSERT, 있으면 UPDATE -> LIST 로 처리하기

by 지구 2020. 4. 2.

개발자라면 한 번 쯤은 들어봤을.. 있으면 INSERT, 없으면 UPDATE ..

Model 을 하나씩 받아서 처리하면 더할나위 없이 좋겠지만, Model 을 List 로 받아서 처리해야 될 때도 있다.

 

여기까진 단순하게 조금만 구글링하면 나온다.

// in mapper
void insertUserInfo(@Param("userInfoList") List<UserInfo> userInfoList);
// in xml
<insert id="insertUserInfo">
    INSERT
    INTO user_info ( user_no, user_id, user_name )
    VALUES
    <foreach collection="userInfoList" item="userInfo" separator=",">
    	( #{userNo}, #{userId}, #{userName} )
    </foreach>
</insert>

 

근데 이제 여기서 userNo(PK라고 가정하자) 가 없으면 INSERT, 있으면 UPDATE 해야 된다면 ??

// in xml
<insert id="insertUserInfo">
    INSERT
    INTO user_info ( user_no, user_id, user_name )
    VALUES
    <foreach collection="userInfoList" item="userInfo" separator=",">
    	( #{userNo}, #{userId}, #{userName} )
    </foreach>
    // ** this block add
    ON DUPLICATE KEY UPDATE -- PK 가 중복이라면 UPDATE 할 필드 작성
        user_id = #{userId}, user_name = #{userName}
</insert>

(MySQL 기준) ON DUPLICATE KEY UPDATE ... 를 추가하겠지만,

선언한 #{userId} 랑 #{userName} 은 <foreach> 문에서만 유효하기 때문에 SQLException 이 발생한다.

 

이럴때는 "values()" 를 사용하자 (*** 핵심 땅땅! 이걸로 삽질 많이 했다ㅠ)

// in xml
<insert id="insertUserInfo">
    INSERT
    INTO user_info ( user_no, user_id, user_name )
    VALUES
    <foreach collection="userInfoList" item="userInfo" separator=",">
    	( #{userNo}, #{userId}, #{userName} )
    </foreach>
    ON DUPLICATE KEY UPDATE -- PK 가 중복이라면 UPDATE 할 필드 작성
    	// ** this is important
        user_id = #{userId}, user_name = #{userName}
</insert>

참고 : https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

반응형

댓글