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
'Develop' 카테고리의 다른 글
CI와 DI의 개념 및 용도 (3) | 2025.01.20 |
---|---|
[jQuery] forEach 와 each 사용법과 다양한 예제 (2) | 2025.01.13 |
[PostgreSQL] 함수(function)나 프로시저(procedure) 내용을 검색하거나 조회하는 방법 : 한방쿼리 (1) | 2025.01.07 |
[MyBatis] selectKey를 사용하여 생성된 키값을 Java에서 리턴받는 방법 (3) | 2024.12.31 |
[PostgreSQL] 문자 자리수 계산 ... 그 외 문자열 함수 활용 예제 (3) | 2024.12.26 |