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


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


이슈

Mybatis foreach 사용법이 생각이 안나서 정리함.


해결

  1. Mapper 파라미터가 List 일 경우
  2. Mapper 파라미터가 Model객체 내 List를 foreach로 활용 할 경우
  3. Mapper 파라미터가 Map 일 경우



1. Mapper 파라미터가 List 일 경우


@Mapper

void insertBoardList(List<Board> boardList) throws Exception;

SQL Mapper

<insert id="insertBoard" parameterType="java.util.List">
    INSERT INTO T_BOARD
    (
        TITLE
        , CONTENTS
        , DISPLAY_YN
        , EMAIL
        , REG_ID
        , REG_DATE
    )
    VALUES
    (
    <foreach collection="list" item="item" separator=",">
        #{item.title}
        , #{item.contents}
        , #{item.displayYn}
        , #{item.email}
        , #{item.regId}
        , NOW()
    </foreach>
    )
</insert>

! collection="list" item="item" 는 defualt 이다.




2. Mapper 파라미터가 Model객체 내 List를 foreach로 활용 할 경우


Board.java (참고용)

@Data
public class Board implements Serializable  {

    public Integer boardIdx;
    //...생략...
    List<BoardReply> boardReplyList;
}

@Mapper

BoardReply selectBoardReply(Board board) throws Exception;
<select id="selectBoardReply" parameterType="BoardSearch" resultType="BoardReply">
    SELECT
        BOARD_IDX
        , REPLY_IDX
        , TITLE
        , CONTENTS
    FROM
        T_BOARD_REPLY
    WHERE
        BOARD_IDX = #{boardIdx}
        AND REPLY_IDX NOT IN (
        <foreach collection="boardReplyList" item="item" separator=",">
            #{item.replyIdx}
        </foreach> )
</select>

! collection Id 값과 parameterType 객체 내 필드명을 동일하게 해야함




3. Mapper 파라미터가 Map 일 경우


ServiceImpl.java (참고용

@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>



도움되길 빕니다.