mybatis的foreach官方文檔解釋:對一個集合進行遍歷,通常是在構建IN條件語句的時候使用。例如
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及在迭代結果之間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多餘的分隔符。
注意 你可以將任何可迭代對象(如 List、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. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list
2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array
3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可
以封裝成map,實際上如果你在傳入參數的時候,在breast裏面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裏面的key 下面分別來看看上述三種情況的示例代碼:
單參數List的類型:
java:
public int dynamicForeachList(List<String> ids);
<!--錯誤寫法:注意觀察collection中參數的寫法-->
<delete id="dynamicForeachList">
DELETE FROM s_user
WHERE id in
<foreach item="ids" collection="ids" open="(" separator=","close=")">
#{ids}
</foreach>
</delete>
<!--正確寫法-->
<delete id="dynamicForeachList">
DELETE FROM s_user
WHERE id in
<foreach item="ids" collection="list" open="(" separator=","close=")">
#{ids}
</foreach>
</delete>
你也可以使用@Param(“ids”) 來指定參數名稱,這樣就可以用自己的list名稱了,如以下寫法正確
java:
public int dynamicForeachList(@Param("ids")List<String> ids);
sql:
<delete id="dynamicForeachList">
DELETE FROM s_user
WHERE id in
<foreach item="ids" collection="ids" open="(" separator=","close=")">
#{ids}
</foreach>
</delete>
這樣則正確。.
單參數array數組的類型:
同樣注意collection屬性的值:array
java:
public List dynamicForeachArray(int[] ids);
sql:
<select id="dynamicForeachArray" parameterType="java.util.ArrayList" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
自己把參數封裝成Map的類型
java
public List dynamicForeachMap(Map params);
sql
<select id="dynamicForeachMap" parameterType="java.util.HashMap" resultType="Blog">
select * from t_blog where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
注意:上面說的是傳入參數是單個的List、Array、Map,如果是 傳入的一個 對象或者 map, 其中有個屬性是 list 或者array,那麼colletion=“屬性名”。
java
class example{
List<String> subCodes;
}
sql:
<!--傳遞的參數是對象-->
<if test="subCodes != null">
and s.Code in
<foreach collection="subCodes" item="subCode" open="(" close=")" separator=",">
${subCode}
</foreach>
</if>