[Mybatis] foreach insert duplicate update 처리(Upsert)

    Upsert란 UPDATE + INSERT를 합친 단어이다. 

    중복되는 값이 있으면 UPDATE, 없으면 INSERT 하는 쿼리라고 생각하면 된다.

     

    Mybatis에서 다중 INSERT 하는 방법은 다음과 같다. 

    <insert id="insertData" parameterType="java.util.List">
      INSERT 테이블명 ( name, age ) VALUES
      <foreach collection="list" item="alias" separator=",">
      ( #{alias.name} , #{alias.age})
      </foreach>
    </insert>

     

    만약, INSERT 시 PK(=name)가 중복된 경우에 특정 칼럼만 UPDATE 하고 싶다면 ON DUPLICATE KEY UPDATE를 사용하면 된다.

     

    <insert id="insertData" parameterType="java.util.List">
      INSERT 테이블명 ( name, age ) VALUES
      <foreach collection="list" item="alias" separator=",">
         ( #{alias.name} , #{alias.age} )
      </foreach>
      ON DUPLICATE KEY UPDATE
       age = VALUES (age)
    </insert>

     

    ON DUPLICATE KEY UPDATE는 INSERT  먼저하고 중복된 키가 있으면 UPDATE 한다.

    foreach에서 사용한 alias는 < foreach > 안에서만 유효한 지역변수라서 바깥에서 쓰려면 VALUES(칼럼명)를 사용해줘야 한다. 

     

    삽질 로그

     

    둘 다 같음 ^^..

     <foreach collection="list" item="alias" separator=",">
      ( #{alias.name} , #{alias.age})
      </foreach>

     

     <foreach collection="list" item="alias" open="(" separator="," close=")">
       #{alias.name} , #{alias.age}
      </foreach>

     

     

     

    참고 링크 

    728x90

    댓글