Mybatis的 foreach 標籤使用方法.

尤尤尤奴斯發表於2018-11-12

1.foreach

foreach用在mapper檔案中可以在SQL語句中進行迭代一個集合。

foreach元素的屬性主要有 item,index,collection,open,separator,close。

item表示集合中每一個元素進行迭代時的別名,

index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,

open表示該語句以什麼開始,一般為"(",常用在 in(),values()中,與close屬性一起使用

separator表示在每次進行迭代之間以什麼符號作為分隔符,一般為"," 

close表示以什麼結束,一般為")"

collection屬性是在使用foreach的時候最關鍵的也是最容易出錯的,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,如果介面檔案中沒有指定@Param引數 ,主要有一下3種情況: 

1.當傳入要迭代的集合為List時,collection屬性寫作list.

<select id="findUserListByIdList" parameterType="java.util.ArrayList" resultType="User">  
    select * from user user  
    <where>  
        user.ID in   
        <foreach item="user" index="index" collection="list" open="(" close=")"
            separator=","> #{user} </foreach>  
       
    </where>  
</select>   

2.當傳入的集合為陣列時,collection屬性寫作array:

<select id="findUserListByIdList" parameterType="java.util.HashList" resultType="User">  
    select * from user user  
    <where>  
        user.ID in  
        <foreach item="user" index="index" collection="array"  open="(" close=")" 
            separator=","> #{user} </foreach>  
        
    </where>  
</select>   

3.當傳入集合為map時,collection屬性為map中對應要迭代的集合的key,如

①當map中有一個key為idList的集合時,collection寫作"idList"

<select id="exists" parameterType="java.util.HashMap" resultType="java.lang.Integer">  
        SELECT COUNT(*) FROM USER user  
        <where>  
            <if test="idList !=null ">  
                user.ID in (  
                <foreach item="user" index="index" collection="idList"  
                    separator=","> #{user} </foreach>  
                )  
            </if>  
        </where>  
</select>  

②當要遍歷當前map時,由於map沒有預設的別名,需要在介面檔案中標註@Param引數,指定map的名字

public interface XXXDao {  
  
    public void saveXXX(@Param("params")Map<String, String> params);  
      
}  

xml檔案中:通過params.keys獲取鍵的集合,param.value獲取值集合

  <insert id="XXX" parameterType="java.util.Map">
    INSERT INTO table
    <foreach collection="params.keys" item="key" open="(" separator="," close=")">
        獲取值:#{param[key]}
        鍵:#{key}
    </foreach>
    VALUES
    <foreach collection="param.value" item="val" open="(" separator="," close=")">
       值:#{val}
    </foreach>
</insert>

也可以通過params.entrySet()獲取集合

 <insert id="XXX" parameterType="java.util.Map">  
    INSERT INTO table(a, b)  
    VALUES  
    <foreach collection="params.entrySet()" open="         
     (" separator="," close=")" index="key" item="val">  
        #{key}, #{val}  
    </foreach>  
  </insert>  

 

4.當傳入型別為物件型別,若物件中有list或array時,foreach中的collection必須是具體list或array在BEAN中的變數名。

<select id="findUserListByDTO" parameterType="UserDTO" resultType="java.lang.Integer">  
        SELECT COUNT(*) FROM USER user  
        <where>   
            <if test="idList !=null ">  
                user.ID in (  
                <foreach item="guard" index="index" collection="idList"  
                    separator=","> #{guard} </foreach>  
                )  
            </if>  
        </where>  
</select>  

 

結論:

foreach遍歷的物件,作為入參時,List物件預設用list代替作為鍵,陣列物件有array代替作為鍵,Map物件沒有預設的鍵。也就是傳入的集合(list,array,map)的名字,這個名字可以在foreach裡面隨便引用)
當然在作為入參時可以使用@Param("params")來設定鍵,設定keyName後,list,array將會失效。建議設定@Param屬性來指定keyName.

 

 

相關文章