mybatis foreach CollectionのList、Array、Map


mybatisのforeach公式ドキュメント解釈:IN条件文を構築する際に使用される集合を巡回する.たとえば
  SELECT *   FROM POST P   WHERE ID in           #{item}  
foreach要素の機能は非常に強力で、要素内で使用できる集合項目(item)とインデックス(index)変数を宣言する集合を指定できます.また、先頭と末尾の文字列を指定し、反復結果の間に区切り記号を配置することもできます.この要素はインテリジェントなので、余分な区切り文字を偶然追加することはありません.
注意:
リスト、Setなどの反復可能なオブジェクト、Mapオブジェクト、または配列オブジェクトを集合パラメータとしてforeachに渡すことができます.反復可能なオブジェクトまたは配列を使用する場合、indexは現在の反復の回数であり、itemの値は今回の反復で取得された要素である.Mapオブジェクト(またはMap.Entryオブジェクトのセット)を使用する場合、indexはキー、itemは値です.
foreach要素の属性は主にitem,index,collection,open,separator,closeである.
item                  ,
index       ,          ,        ,
open          ,
separator                      ,
close       。

foreachを使用する場合、最も重要なのはcollectionプロパティです.このプロパティは指定する必要がありますが、場合によっては値が異なります.主に3つのケースがあります.
1.単一パラメータでパラメータタイプがリストである場合、collection属性値はlist 2となる.単一パラメータでパラメータタイプがarray配列である場合、collectionのプロパティ値はarray 3になります.入力がParam修飾(@Param("ids")List ids)の場合、collectionの属性値はids 4となる.入力されたパラメータが複数の場合は、Mapにカプセル化する必要があります.もちろん、単一のパラメータでもいいです.
mapにカプセル化します.実際にパラメータを入力すると、breastでもmapにカプセル化されます.mapのkeyはパラメータ名です.このときcollection属性値は、入力したリストまたはarrayオブジェクトが自分のカプセル化したmapのkeyの下で、上記の3つのケースのサンプルコードを見てみましょう.
単一パラメータリストのタイプ:
 java:  public int dynamicForeachList(List  ids);
DELETE FROM s_user WHERE id in ids"open="("separator=","close=")">     #{ids}
DELETE FROM s_user WHERE id in list"open="("separator=","close=")">    #{ids}  
@Param("ids")を使用してパラメータ名を指定することもできます.これにより、以下のように自分のlist名を使用することができます.
java:
 public int dynamicForeachList(@Param("ids")List  ids);

sql:

DELETE FROM s_user
WHERE id in

#{ids}



これは正しい.
 
単一パラメータarray配列のタイプ:
同様にcollectionプロパティの値に注意してください:array
java:
public List dynamicForeachArray(int[] ids);

sql:


自分でパラメータをMapのタイプにカプセル化する
java
public List dynamicForeachMap(Map params);

sql


注意:入力パラメータは単一のList、Array、Mapであり、入力されたオブジェクトまたはmapの場合、リストまたはarrayの属性がある場合、colletion=「属性名」である.
java: class example{   List subCodes; }   
sql:     and s.Code in             ${subCode}                 
 
その他の例:
1、List InList、List strListの集合には基本タイプが格納されている

その中の伝達パラメータはList集合であるためcollectionの値はlistを直接使用して代替され、indexはこの集合が遍歴するインデックス値であり、itemはlistの現在のインデックス位置の値openとcloseがペアで現れ、開始と終了の記号であり、separatorはセパレータである.
2、List objList、List userListリファレンスタイプのデータ
package soufun.com;

public class Users {
private int id;
private String name;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
}

このクラスを例にとると、
 java:  public int dynamicForeachList(List  uusers);


ループ挿入
insert into t_blog(id,name) values
  
    (#{item.id},#{item.name})


Listとarrayは似ています.
 
次にmapの遍歴を見てみましょう.
	HashMap foreachMap= new HashMap();
	map.put("name1", "www1");
	map.put("name2", "www2");
	map.put("name3", "www3");
	map.put("name4", "www4");
	map.put("name5", "www5");
	map.put("name6", "www6");

sqlSession.selectList(" getByMap", foreachMap);


その中のforeachMapは伝達するMap集合indexはmapのkey itemはmapのvalueです
mapは、次の方法で巡回することもできます.
1、循環key:
   
    ${k} = #{k}    
 

2、循環values
   
    ${v} = #{v}    
 

3、循環取得keyと値:
   
        
        ${k} = ${condition[k]}    
      
 

${k}=#{condition[${k}]}はmybatis 3ではあまり使いにくい.3で${k}=#{condition.${k}}に変更すると使いやすい
ここまでは終わりましたが、ちょっと言いたいことがあります.それはinの遍歴です.一般的にはforeachを使って組み立てられていますが、このように書かれています.
String  name ="'w1','w2','w3','w4'";

これが自分でinを組み立てた文字列で、mybatisのforeachを使わずに組み立てたのは同じです.