Programming/Mybatis

[Mybatis] ParameterType List, Map 처리 (feat. foreach구문)

OriginMaster 2021. 11. 26. 10:57
반응형

Rest API에서 8만개가 넘는 데이터를 DB에 넣어줄 일이 생겼다.

 

컨트롤러에서 insert를 for문으로 돌려보니 매우 비효율적이었고,

 

생각해보니 mapper에 파라미터를 list로 가져가면 되지않을까 하는 생각이 들어 찾아보니 역시 방법이 있었다..

 

 

+) 80,000개의 데이터를 for문으로 insert했을 땐 몇 분 걸렸던 처리가 15초만에 처리되었다...

 

 

But....

 

 

단점) insert를 한번에 처리하기 때문에 validation 에러가 났을 경우 모든 데이터가 insert 되지 않는다...

 

 

 

 

  • Mapper 파라미터가 List일 경우
<insert id="insertBoard" parameterType="java.util.List">
    INSERT INTO T_BOARD
    (
        TITLE
        , CONTENTS
        , DISPLAY_YN
        , EMAIL
        , REG_ID
    )
    VALUES
    <foreach collection="list" item="item" separator=",">
        (
        "${item.title}"
        , "${item.contents}"
        , "${item.displayYn}"
        , "${item.email}"
        , "${item.regId}"
        )
    </foreach>
</insert>

※     #{item.title} 로 테스트 했을 때 데이터를 읽어오지 못하는 문제가 있었다...

       => "${item.title}" 로 대체.

 

 

 

  • Mapper 파라미터가 Map일 경우
@Override
public void insertEventGoodsMng(Map<String, Object> dbParams) {
    // dbParams={eventIdx=113, cate=24, ...}
    List<Map<String, Object>> goodsList = boardMapper.selectGoodsList(dbParams);
    dbParams.put("goodsList", goodsList);
    eventMapper.insertEventGoodsMng(dbParams);
}
<insert id="insertEventGoodsMng" parameterType="java.util.HashMap">
    <if test="goodsList.size != 0">
        INSERT INTO EVENT_GOODS_MNG
        (
            EVENT_GOODS_MNG_IDX
            , GOODS_IDX
        )
        VALUES
        <foreach collection="goodsList" item="item" separator=",">
        (
            "${eventIdx}"
            , "${item.goodsIdx}"
        )
        </foreach>
    </if>
</insert>

 

 

출처

https://linked2ev.github.io/mybatis/2020/01/05/MyBatis-5-foreach-%EA%B5%AC%EB%AC%B8,-parameterType-List-Model-Map/

 

[MyBatis] foreach 구문, parameterType List, Model, Map 사용

MyBatis로 foreach 구문, parameterType List Model Map 사용

linked2ev.github.io

 

반응형