Mybatis的 foreach 標籤使用方法.
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.
相關文章
- MyBatis foreach標籤MyBatis
- MyBatis學習——foreach標籤的使用MyBatis
- mybatis中foreach標籤詳解MyBatis
- mybatis foreach標籤的解釋 與常用之處MyBatis
- MyBatis從入門到精通(八):MyBatis動態Sql之foreach標籤的用法MyBatisSQL
- Mybatis系列:解決foreach標籤內list為空的問題MyBatis
- mybatis 根據多個id查詢資料 foreach標籤MyBatis
- Mybatis中Foreach動態SQL標籤(map和list兩種情況)MyBatisSQL
- Mybatis中常用的標籤MyBatis
- mybatis的 choose -- when test -- otherwise 標籤和 if test 標籤的區別MyBatis
- 利用c:forEach標籤遍歷陣列陣列
- MyBatis if 標籤的坑,居然被我踩到了。。。MyBatis
- 淺析Bootstrap中Tab(標籤頁)的使用方法boot
- mybatis foreach迴圈MyBatis
- MyBatis系列(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- mybatis中 if 標籤 test 等於判斷MyBatis
- MyBatis中的<where>標籤和where子句的區別MyBatis
- Mybatis的<if>標籤的坑,0會被過濾掉?MyBatis
- MyBatis從入門到精通(六):MyBatis動態Sql之if標籤的用法MyBatisSQL
- mybatis關於list的foreach的使用MyBatis
- 裝置支援多箱號查詢,mybatis標籤MyBatis
- HTML標籤(基本標籤的使用)HTML
- java <%!%>標籤和<%%>標籤的使用Java
- html中常用的標籤-表格標籤HTML
- Mybatis的Mapper對映檔案中常用標籤及作用MyBatisAPP
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis xml foreach迴圈語句MyBatisXML
- C#中foreach基礎使用方法C#
- html中常用的標籤-表單標籤HTML
- IOS 學習筆記(4) 控制元件 標籤(UILabel)的使用方法iOS筆記控制元件UI
- properties標籤和typeAliases標籤
- Mybatis系列全解(八):Mybatis的9大動態SQL標籤你知道幾個?提前致女神!MyBatisSQL
- html中常用的標籤-超連結標籤HTML
- 自定義標籤【迭代標籤】薦
- mybatis foreach之前對list進行判空MyBatis
- Mybatis foreach 請求引數是物件集合MyBatis物件
- mybatis list作為引數 foreach迴圈MyBatis