mybatis 可変長引数メソッドをSQLアノテーションで。。。

Javaメソッド可変長引数(variable length arguments)使用での
SQLアノテーション

リストを引数にした場合のサンプル

@Select("<script>SELECT * FROM tb_items WHERE 1=1"
      + " AND item_id IN <foreach collection='list' item='id'"
      + " separator=',' open='(' close=')'>#{id}</foreach>"
      + "</script>")
public List<Item> getItems(List<Integer> idlist);

list という予約された単語が使える。
配列なら array なのである。

@Select("<script>SELECT * FROM tb_items WHERE 1=1"
      + " AND item_id IN <foreach collection='array' item='id'"
      + " separator=',' open='(' close=')'>#{id}</foreach>"
      + "</script>")
public List<Item> getItems(int...args);

このままでは、引数無しで呼ばれたときに動かないSQLにになるので

@Select("<script>SELECT * FROM tb_items WHERE 1=1"
      + "<if test='array.length > 0'>"
      + " AND item_id IN <foreach collection='array' item='id'"
      + " separator=',' open='(' close=')'>#{id}</foreach>"
      + "</if></script>")
public List<Item> getItems(int...args);

list でも同じことで、if 文が必要ではある。
SQLアノテーションでこのように foreach を書いた時に、アノテーションに渡す文字列のエスケープ
 open=\"(\"
と書かなくてもシングルクォーテーションでXML属性値を書いても
 open='('
ちゃんと認識してくれる。