1. 程式人生 > >Mybatis foreach 批量操作

Mybatis foreach 批量操作

foreach屬性

屬性 描述
item 迴圈體中的具體物件。支援屬性的點路徑訪問,如item.age,item.info.details。
具體說明:在list和陣列中是其中的物件,在map中是value。
該引數為必選。
collection 要做foreach的物件,作為入參時,List<?>物件預設用list代替作為鍵,陣列物件有array代替作為鍵,Map物件用map代替作為鍵。
當然在作為入參時可以使用@Param("keyName")來設定鍵,設定keyName後,list,array,map將會失效。 除了入參這種情況外,還有一種作為引數物件的某個欄位的時候。舉個例子:
如果User有屬性List ids。入參是User物件,那麼這個collection = "ids"
如果User有屬性Ids ids;其中Ids是個物件,Ids有個屬性List id;入參是User物件,那麼collection = "ids.id"
上面只是舉例,具體collection等於什麼,就看你想對那個元素做迴圈。
該引數為必選。
separator 元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該引數可選。
open foreach程式碼的開始符號,一般是(和close=")"合用。常用在in(),values()時。該引數可選。
close foreach程式碼的關閉符號,一般是)和open="("合用。常用在in(),values()時。該引數可選。
index 在list和陣列中,index是元素的序號,在map中,index是元素的key,該引數可選。
<select id="countByUserList" resultType="_int" parameterType="list">  
select count(*) from users  
  <where>  
    id in  
    <foreach item="item" collection="list" separator="," open="(" close=")" index="">  
      #{item.id, jdbcType=NUMERIC}  
    </foreach>  
  </where>  
</select> 

::select count(*) from users WHERE id in ( ? , ? )
<insert id="addList">
		
		INSERT INTO DELIVER
			(
	         	<include refid="selectAllColumnsSql"/>
	         )
	     
	      <foreach collection="deliverList" item="item" separator="UNION ALL">
				SELECT 
					 #{item.id, jdbcType=NUMERIC},
					 #{item.name, jdbcType=VARCHAR}
				FROM DUAL
	      </foreach>
    </insert>

::insert into deliver select ?,? from dual union all select ?,? from dual
<insert id="ins_string_string">  
        insert into string_string (key, value) values  
        <foreach item="item" index="key" collection="map"  
            open="" separator="," close="">(#{key}, #{item})</foreach>  
    </insert> 

::insert into string_string (key, value) values (?, ?) , (?, ?)  -- mysql
<select id="sel_key_cols" resultType="int">  
        select count(*) from key_cols where  
        <foreach item="item" index="key" collection="map"  
            open="" separator="AND" close="">${key} = #{item}</foreach>  
    </select> 

::select count(*) from key_cols where col_a = ? AND col_b = ?  (一定要注意到$和#的區別,$的引數直接輸出,#的引數會被替換為?,然後傳入引數值執行。)