티스토리 뷰

Backend/Springboot

mybatis - foreach 완벽이해

sjh9391985 2023. 2. 20. 20:13
728x90

회사에서 mybatis를 사용하는데 평소에도 bulk 쿼리를 통한 insert, update, delete 사용을 하였는데 내용을 애매하게 숙지하고 있어서 오늘 정리를 해봅니다.

 

먼저 mybatis 에서는 foreach를 통하여 값들을 반복해서 작업을 할 수 있는데, 쿼리문을 여러번 호출하여 작업을 하는것이 아닌 한번의 쿼리에서 반복된 작업을 할 수 있어 유용하게 사용할 수 있습니다.

1. Mybatis foreach 개념

아래는 mybatis foreach 에서 사용하는 개념입니다. 이 개념을 정확히 숙지하고 있어야 foreach 문을 정확히 사용가능합니다.

- collection : 전달받은 인자,  List나 Array 형태만 가능

- item : 전달받은 인자값을 alias 명으로 대체

- open : 해당 구문이 시작될 때 삽입할 문자열

- close : 해당 구문이 종료될때 삽입할 문자열

- separator : 반복 되는 사이에 출력할 문자열

 

foreach 예제 (select, insert, update, delete 모두 응용가능)

 

먼저 쿼리를 호출하는 mapper 와 예제 model 을 작성하겠습니다.

Class RequestModel {

private String str; // 클라이언트측에서 보내는 문자값 ("A")

private String [] arr; // 클라이언트측에서 보내는 배열 (["B","C","D"])
    
}
// 요청받은 데이터는 문자열과 배열값이 있다고 가정하고 Hashamp에 넣어서 Model값이 있다고 가정하자

Class SqlMapper {
	List<ResponseModel> list = sql.selectList(요청받은값);
}
-- 위의 예시처럼 select 문 요청시

1. 아래의 쿼리의 틀이 생깁니다. (parameterType은 생략가능)
<select id="selectList" resultType="package.ResponseModel">

</select>

2. foreach "in" 사용예제
<select id="selectList" resultType="package.ResponseModel">
    SELECT a, b 
    FROM Table 
    WHERE b in
        <foreach collection="RequestModel.arr" index="index" open="(" close=")" item="item" separator=",">
        #{item}
        </foreach>
</select>

- collection : 전달받은 인자,  List나 Array 형태만 가능

- item : 전달받은 인자값을 alias 명으로 대체

- open : 해당 구문이 시작될 때 삽입할 문자열

- close : 해당 구문이 종료될때 삽입할 문자열

- separator : 반복 되는 사이에 출력할 문자열

3. 만약에 b 라는 컬럼에 대해서 in 을 통해서 RequestModel에 있는 arr이라는 값을 통해서 
결과를 도출하고 싶을 경우에 mapper에 넣은 model의 정확한 인자 배열 혹은 List를 명시 해주면 됩니다.

그렇기에 collection 부분에는 arr이라는 배열을 명시해주고 item을 alias 명으로 대체해서 사용하면 값이 들어갑니다.

또한 open, close는 반복절의 앞과 뒤에 표기를 해주는것이며 separator는 값을 구분해주기위하여 사용합니다.

그래서 해당 배열 값을 도출하기 위해서는 item이라고 표기를 해주며 만약 일반적인 string 값을 사용할 경우에는
<select id="selectList" resultType="package.ResponseModel">
    SELECT a, b 
    FROM Table
    WHERE a = {param.str}
</foreach>

이런식으로 표기 할 수 있습니다.
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함