mybatis の foreach

iBATIS2の動的SQL <iterate> は、mybatis3 になると廃止され
代わりに <foreach> が用意されてる。使い方はほとんど同じだが
動的valueの記述を item="xxx" で定義するようになり少し書きやすくなってる。

<select id="selectCustomer" resultType="sample.Customer" 
                parameterType="コレクション kanalistを 要素名としてもつクラス">

    select * from CUSTOMER
    where substr(KANANAME,1,1) in
      <foreach  item="item" open="(" close=")" collection="kanaList"
                separator=",">

      #{item}
     </foreach>

</select>
=============================
collection="kanaList" と指定したら、SqlSession#selectList の引数Object に、
java.util.Collection を返す対応するgetter名メソッド用意したインスタンス
渡すか、もしくは、public フィールドで宣言した、
   public List<String> kanaList;
でリスト要素が格納されたインスタンスを渡せば良い。
Oracle ADF + EJB と違ってわざわざ、setter, getter でなくても良いところが便利である。


import java.util.ArrayList;
import java.util.List;

/**
 * SqlSession#selectList に渡すパラメータ
 */

public class KanaParam{
   public List<String> kanaList;
   public KanaParam(){
      this.kanaList = new ArrayList<String>();
   }
//   public List<String> getKanaList(){
//      return this.kanaList;
//   }
//   public void setKanaList(List<String> kanaList){
//      this.kanaList = kanaList;
//   }

   public void addKana(String kana){
      this.kanaList.add(kana);
   }
}

============================================
コメントのように↑setter, getter を省略もできる。
 KanaParam kanaParam = new KanaParam();
 kanaParam.addKana("ア");
 kanaParam.addKana("イ");
 kanaParam.addKana("ウ");
 List<?> clist = sqlsession.selectList("searchCustomer",kanaParam);