Develop

[MyBatis] foreach 사용 방법 - list dto map 예제

issuemaker99 2025. 1. 8. 15:34
728x90

MyBatis의 foreach는 SQL 문에서 반복적으로 조건을 구성하거나 값을 설정할 때 유용하게 사용됩니다. 이 글에서는 parameterType list, DTO 내의 list 객체, 그리고 map인 경우로 나눠 예제를 제공하며, DTO 내의 리스트가 DTO 객체의 리스트인 경우와 map에서 키를 갖는 경우를 함께 설명합니다.


1. parameterType이 list인 경우

parameterType이 list일 때, MyBatis는 전달된 리스트를 반복하여 SQL을 생성합니다.

XML Mapper 예제

<select id="selectUsersByIds" parameterType="list" resultType="User">
    SELECT * 
    FROM users
    WHERE id IN
    <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

 

Java 코드 예제

List<Integer> userIds = Arrays.asList(1, 2, 3, 4);
List<User> users = userMapper.selectUsersByIds(userIds);

 


2. DTO 내에 DTO 리스트가 포함된 경우

DTO 내부에 리스트가 단순 값이 아니라 또 다른 DTO의 리스트인 경우, foreach에서 해당 리스트의 요소를 명시적으로 접근해야 합니다.

XML Mapper 예제

<select id="selectUsersByDtoList" parameterType="UserFilterDto" resultType="User">
    SELECT * 
    FROM users
    WHERE id IN
    <foreach item="filter" index="index" collection="filters" open="(" separator="," close=")">
        #{filter.id}
    </foreach>
</select>

 

Java DTO와 코드 예제

UserFilter 클래스

public class UserFilter {
    private Integer id;

    // Getter, Setter
}

 

UserFilterDto 클래스

public class UserFilterDto {
    private List<UserFilter> filters;

    // Getter, Setter
}

 

Java 코드

UserFilter filter1 = new UserFilter();
filter1.setId(1);

UserFilter filter2 = new UserFilter();
filter2.setId(2);

UserFilterDto dto = new UserFilterDto();
dto.setFilters(Arrays.asList(filter1, filter2));

List<User> users = userMapper.selectUsersByDtoList(dto);

 


3. parameterType이 map이고 키를 갖는 경우

map에서 키와 값 구조를 사용할 때는 collection에 값 리스트를 지정하고, 반복 중 필요한 키 값을 명시적으로 사용합니다.

XML Mapper 예제

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

 

Java 코드 예제

@Override
public void insertEventGoodsMng(Map<String, Object> dbParams) {
    List<Map<String, Object>> goodsList = boardMapper.selectGoodsList(dbParams);
    dbParams.put("goodsList", goodsList);
    eventMapper.insertEventGoodsMng(dbParams);
}
LIST