SQL/Mybatis Framework
[MyBatis] PK가 없으면 INSERT, 있으면 UPDATE -> LIST 로 처리하기
지구
2020. 4. 2. 16:08
개발자라면 한 번 쯤은 들어봤을.. 있으면 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
반응형