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>
출처
[MyBatis] foreach 구문, parameterType List, Model, Map 사용
MyBatis로 foreach 구문, parameterType List Model Map 사용
linked2ev.github.io
반응형