개발 창고/Web

[MyBatis] foreach문

로이제로 2023. 2. 21. 22:00
반응형
<select id="getList" resultType="com.tistory.royzero.Data">
    SELECT Col1
         , Col2
         , Col3
      FROM Tab
     WHERE Col1 IN
     <foreach item="item" index="idx" collection="list" open="(" separator="," close=")">
        #{item}
     </foreach>
</select>

 

 iBATIS에서 사용되던 iterate  문법이 MyBatis에 와서는 foreach문으로 변경되었습니다. 이는 JSTL에서 사용되는 foreach와 유사하다고 보면 됩니다.

 

 사용되는 파라미터는 아래와 같습니다.

파라미터 내용
item 현재 항목 alias
index 현재 항목의 Index값 (0부터 시작)
collection foreach에서 반복될 목록 파라미터
open foreach문이 시작되는 부분에 넣어줄 문자열
separator 항목과 항목 사이에 삽입될 문자열
close foreach문이 종료되는 부분에 넣어줄 문자열

 만약 전달된 파라미터가 아래와 같이 배열 자체로 전달되었다고 가정하면

String[] params = {"a", "b", "c"};

selSession.selectList("getList", params);

colection은 반드시 array로 지정되어야 하며

<select id="getList" resultType="com.tistory.royzero.Data">
    SELECT Col1
         , Col2
         , Col3
      FROM Tab
     WHERE Col1 IN
     <foreach item="item" index="idx" collection="array" open="(" separator="," close=")">
        #{item}
     </foreach>
</select>

해당 Query는 아래와 같이 parsing 되어 호출됩니다.

    SELECT Col1
         , Col2
         , Col3
      FROM Tab
     WHERE Col1 IN
     (		-- open
      'a'	-- item (idx 0)
      ,		-- separator
      'b'	-- item (idx 1)
      ,		-- separator
      'c'	-- item	(idx 2)
     )		-- close

각 항목들은 위와 같이 open 문자열인 시작 괄호 "("를 시작으로 item이 순서대 "a", "b", "c"로 지정되며 중간중간에 separator 문자열로 지정된 콤마(,)가 추가되고 마지막에 close 문자열인 종료 괄호 ")"가 출력됩니다. 

 

만약 String이 아닌 Class나 Map형태로 지정된 List가 전달된 경우,

List<HashMap<Stirng, Object>> params = new ArrayList<>();

HashMap<String, Object> item1 = new HashMap<>();
item1.put("col1", "a");
item1.put("col2", "1");
item1.put("col3", "!");
params.add(item1);

HashMap<String, Object> item2 = new HashMap<>();
item2.put("col1", "b");
item2.put("col2", "2");
item2.put("col3", "@");
params.add(item2);

HashMap<String, Object> item3 = new HashMap<>();
item3.put("col1", "c");
item3.put("col2", "3");
item3.put("col3", "#");
params.add(item3);

selSession.selectList("getList", params);

param의 값은 아래와 같고

col1 col2 col3
a 1 !
b 2 @
c 3 #

여기서 col1값을 가지고 foreach문을 조회하고 싶은 경우 아래와 같이 item에 col1을 지정하여 호출해 주면 됩니다.

<select id="getList" resultType="com.tistory.royzero.Data">
    SELECT Col1
         , Col2
         , Col3
      FROM Tab
     WHERE Col1 IN
     <foreach item="item" index="idx" collection="array" open="(" separator="," close=")">
        #{item.col1}
     </foreach>
</select>

foreach문에서 #{item.col1} 이 추가된 것을 확인할 수 있습니다.

반응형