1. 程式人生 > >MaBatis:使用foreach進行批量插入和批量刪除

MaBatis:使用foreach進行批量插入和批量刪除

MaBatis:使用foreach進行批量插入和批量刪除

foreach可以在SQL語句中通過拼接的方式進行集合迭代。foreach元素的屬性主要有collection,item,index,separator,open,close。

1.item屬性:表示迴圈體中的具體物件,即集合中每一個元素進行迭代時的別名。
具體說明:item支援屬性的點路徑訪問,如item.age,item.info.details。在list和陣列中是其中的物件,在map中是value。該引數為必選。

2.index屬性:指定一個名字,用於表示在迭代過程中,每次迭代到的位置。
具體說明:在list和陣列中,index是元素的序號,在map中,index是元素的key,該引數可選。

3.separator屬性:表示在每次進行迭代之間以什麼符號作為分隔符。
具體說明:例如在in()的時候,separator=","會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該引數可選。

4.open屬性:foreach程式碼的開始符號,表示該語句以什麼開始。
具體說明:一般是"(“和close=”)"合用。常用在in(),values()時。該引數可選。

5.close屬性:foreach程式碼的結束符號,表示該語句以什麼結束。
具體說明:一般是")“和open=”("合用。常用在in(),values()時。該引數可選。

6.collection屬性

:foreach傳入的物件引數。
具體說明:該引數必選。在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
      a. 如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list ;
      b. 如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array ;
      c. 如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map了,當然單引數也可以封裝成map。實際上在傳入引數的時候,框架也會把它封裝成一個Map的,map的key就是引數名,這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key。

使用foreach進行批量插入的對映檔案示範如下

<insert id="insertUserList">
	insert into t_user (user_name,sex) values
        <!-- 動態SQL之foreach的用法 -->
        <!-- 
        	collection="users" 用於指定迴圈集合的名稱,如果介面中並未指定引數別名,那麼預設就是list
         	item="u" 用於指定每次迴圈後的物件的別名
        	separator="," 用於指定每次迴圈後之間的分割符
        -->
        <foreach collection="users" item="user" separator=",">
            (#{user.userName},#{user.sex})
        </foreach>
</insert>

使用foreach進行批量刪除的對映檔案示範如下

<delete id="batchDeleteUser">
	delete from t_user where id in
	(
        <foreach collection="ids" item="id" separator=",">
            #{id}
        </foreach>
	)  
 </delete>

當然也可以使用下述的格式:

<!-- open表示該語句以什麼開始,close表示以什麼結束 -->
<delete id="deleteUserByIdList">
	delete from t_user where id in 
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
</delete>