본문 바로가기

DB

[MYBATIS] foreach 반복 쿼리 실행(배열, 리스트 등)

쿼리를 작성해야 할때 전달받은 인자값을 바탕으로 반복적인 SQL 구문을 작성할때 유용하다.
대표적으로 체크박스등과 같은 인자값이 동일한 다수의 배열 데이터를 검색조건에 반영해야 할때가 있는데, 이때 OR 구문 또는 IN 구문으로 작성하면 편리하게 사용할 수 있다.


다만 foreach의 경우 인자값으로 List와 Array 형태의 collection 타입만 사용이 가능하다.



foreach 기본 문법 형태


<foreach collection="sUser_type" item="type"  open="(" close=")" separator="or">
 </foreach>

 


collection = 전달받은 인자. List나 Array 형태만 가능
item = 전달받은 인자값을 alias 명으로 대체
open = 해당 구문이 시작될때 삽입할 문자열
close = 해당 구문이 종료될때 삽입할 문자열
separator = 반복 되는 사이에 출력할 문자열
index=반복되는 구문 번호이다. 0부터 순차적으로 증가



List 형태를 넘겼을 경우의 예제.

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
32
33
34
35
36
37
38
39
40
41
42
<java Code>
 
List sUserTP = new ArrayList();
sUserTP.add("SP");
sUserTP.add("BX");
 
 
HashMap hm = new HashMap();
hm.put("sUser_age", 23) ;
hm.put("sUser_type", sUserTP) ;
 
 
<SQL Mapper>
 
<select id="getTList" resultType="hashmap" parameterType="hashmap">
    SELECT
        name, age
    FROM
        TB_user
    WHERE
        age = #{sUser_age} AND
        <foreach collection="sUser_type" item="type"  open="(" close=")" separator="or">
            user_type = #{type.value}
        </foreach>
</select>
 
 
또는 or 구문을 IN 구문으로 변경
 
 
<select id="getTList" resultType="hashmap" parameterType="hashmap">
    SELECT
        name, age
    FROM
        TB_user
    WHERE
        age = #{sUser_age} AND
        user_type IN
        <foreach collection="sUser_type" item="type"  open="(" close=")" separator=",">
            #{type.value}
        </foreach>
</select>




Array 형태를 넘겼을 경우의 예제.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<java Code>
 
String[] sUserTP = {"SP", "BX"} ;
 
HashMap hm = new HashMap();
hm.put("sUser_age", 23) ;
hm.put("sUser_type", sUserTP) ;
 
 
 
<SQL Mapper>
 
<select id="getTList" resultType="hashmap" parameterType="hashmap">
    SELECT
        name, age
    FROM
        TB_user
    WHERE
        age = #{sUser_age} AND
        user_type IN
        <foreach collection="sUser_type" item="type" index="index"  open="(" close=")" separator=",">
            #{type[index]}
        </foreach>
</select>




foreach를 잘 이용하면 단순 검색뿐만 아니라 동일한 구문으로 이루어진 다수의 INSERT, UPDATE도 작성이 가능하니 여러 방면으로 사용이 가능하다.



출처: http://fruitdev.tistory.com/187 [과일가게 개발자]

 

http://huskdoll.tistory.com/518

'DB' 카테고리의 다른 글

[DB]JOIN 구조 이해  (0) 2018.04.14
[Mybaatis(Mysql)] LAST_INSERT_ID() returns 0  (0) 2018.02.02