2013년 5월 9일 목요일

Mybatis foreach 문법


<foreach collection="param.place" item="place"   open="(" close=")" separator="or">
      sh.SNA_SHOW_KIND_IDX = ${place}
 </foreach>

collection = 전달받은 인자값

item   = 전달받은 인자값을 다른이름으로 대체 

open 해당 구문이 시작할떄 (

close 해당구문이 끝날떄

separator  한번 이상 반복할때 반복되는 사이에  해당 문을 넣어줌


note: "collection"파라미터 객체로 MyBatis 에 List 인스턴스나 배열을 전달 할 수 있다. 그렇게 하면 MyBatis는 Map으로
      자동으로 감싸고 이름을 키로 사용한다. List 인스턴스는 'LIST' 를 키로 사용하고, 배열 인스턴스는 'array'
      를 키로 사용한다.


ex)

<select id="..." parameterType="..." resultType="Map">
    select * from test
    <where>
        name in
        <foreach collection="list" item="item" index="index" separator="," open="(" close=")">
            #{item.value}
        </foreach>
    </where>
</select>

mybatis user guide를 보면 foreach의 경우 list나 array 타입을 collection으로 설정할 수 있으며 이때 list나 array 데이터는 map으로 타입이 변환되어 저장된다고 함.



//
// list를 사용할 경우(변수 이름은 list가 아니어도 됨)
//
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

<!-- collection 속성 값은 반드시 list나 array만 설정해야 함 -->
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
    #{item.value}
</foreach>

value 속성을 사용한 것으로 보아 Map.Entry.getValue 메서드를 호출하는 것이 아닐까 하는데...

//
// array를 사용할 경우(변수 이름은 array가 아니어도 됨)
//
String[] array = new String[] { "a", "b", "c" };

<!-- collection 속성 값은 반드시 list나 array만 설정해야 함 -->
<foreach collection="array" item="item" index="index" separator="," open="(" close=")">
    ${array[index]}
</foreach>

select의 parameterType이 map이나 java 오브젝트라면 collection 값에 속성 이름을 설정하면 된다고 함.
//
// parameterType="Map"
//
Map<String, Object> map = new HashMap<String, Object>();
map.put("friendList', list);
<select id="..." parameterType="Map" ...>
    <foreach collection="friendList" .../>
</select>

// parameterType="{Java object}"
//
SomeJavaClass pojo = new SomeJavaClass();
pojo.setEnemyList(list);
<select id="..." parameterType="SomeJavaClass" ...>
    <foreach collection="enemyList" .../>
</select>

댓글 1개:

  1. String[] array = new String[] { "a", "b", "c" };



    ${array[index]}


    parameterType="array" 로 써줘야 하나요??

    답글삭제