Programing/Spring

Oracle mybatis foreach merge 방법 collection merge문

리커니 2019. 8. 13.
반응형

Oracle mybatis foreach merge 방법 collection merge문

 

Oracle에서 키값이 같을 경우 update, 다를 경우 insert 를 할때 사용하는 것이 merge문 입니다.

merge문에 대해서는 아래의 Link를 참고하세요.

 

Link : Mybatis insert, update null 처리, 부적합한 열 유형 처리방법

 

Mybatis insert, update null 처리, 부적합한 열 유형 처리방법, Oracle Merge

Mybatis insert, update null 처리, 부적합한 열 유형 처리방법 Mybatis를 활용해 insert, update 시 변수의 값이 없을 시 부적합한 열 유형 (해당 변수=null) 에러가 발생합니다. 이를 처리하기 위해서는 if 태그.

aljjabaegi.tistory.com

 

단건을 처리할 때는 Link의 방법으로 merge문을 사용하시면 됩니다.

하지만 복수의 데이터를 merge문을 사용하여 데이터를 넣을 때는 고민을 좀 하셔야 되는데요.

그냥 쉽게 Java 단에서 for, iterator 문을 사용해도 결과는 동일 합니다.

하지만 이렇게 되면 데이터 개수만큼 DB 커넥션을 맺어야 하니 속도나 부하 측면에서 좋지 않습니다.

 

그래서 이번 포스팅에서는 Collection 객체를 넘겨서 merge 문을 사용하여

데이터를 넣는 방법을 알아보겠습니다.

 

Collection List 를 사용하여 매퍼로 데이터를 전달하고,

mybatis foreach를 사용하여 임의의 데이터 로우를 만들어 update, insert를 하는 방법입니다.

 

<insert id="insLog" parameterType="java.util.List" >
        MERGE INTO KTF_MSD R1
            USING (
                <foreach  collection="list" item="item" open="" close="" separator="union">
                    SELECT #{item.timestampAccident} AS timestampAccident
                         , #{item.vin} AS vin
                         , #{item.messageId} AS messageId
                     FROM SYS.DUAL
                </foreach>
            ) T1
                ON (R1.TIMESTAMP_ACCIDENT = T1.timestampAccident
                AND R1.VIN = T1.vin
            )
            WHEN MATCHED THEN
                UPDATE 
                <set>
                      R1.MESSAGE_ID = T1.messageId
                </set>
            WHEN NOT MATCHED THEN
                INSERT 
                <trim prefix="(" suffix=")" suffixOverrides="," > 
                      TIMESTAMP_ACCIDENT
                    , VIN
                    , MESSAGE_ID
                </trim>
                <trim  prefix="values (" suffix=")" suffixOverrides=",">
                      T1.timestampAccident
                    , T1.vin
                    , T1.messageId
                </trim>
</insert>

 

USING 다음에 사용된 foreach 문을 보시면,

매개변수로 전달한 list의 데이터를 뽑아 union으로 로우를 만드는 것을 보실 수 있습니다.

일반 insert into의 경우 values 다음에 콤마로 연결해 데이터를 넣으시면 되지만, merge 문의 경우 문법이 다르기 때문에 위와 같이 임의의 데이터행을 만드신 후 그 데이터를 활용하여야 합니다.

 

 

 

 

반응형

댓글

💲 추천 글