foreach元素的屬性主要有 item,index,collection,open,separator,close。
item:表示集合中每一個元素進行迭代時的別名,
index:指 定一個名字,用於表示在迭代過程中,每次迭代到的位置,
separator:表示在每次進行迭代之間以什麼符號作爲分隔符,
open:表示該語句以什麼開始,
close:表示以什麼結束。
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list
2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array
3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在breast裏面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裏面的key
而有些時候,我們看到的不是這三種,collection的屬性值而是直接引用註解中的參數名字,這樣mybatis會忽略類型,按名字引入。這個時候要使用@param:
public User queryUserByParams(@Param("id") Integer id, @Param("userName") String userName);
代碼演示:
1. 當查詢的參數只有一個時findByIds(List<Long> ids)1.a 如果參數的類型是List, 則在使用時,collection屬性要必須指定爲 list<select id="findByIdsMap" resultMap="BaseResultMap">Select<include refid="Base_Column_List" />from jria where ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
findByIds(Long[] ids)1.b 如果參數的類型是Array,則在使用時,collection屬性要必須指定爲 array<select id="findByIdsMap" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from jria where ID in <foreach item="item" index="index" collection="array" open="(" separator="," close=")"> #{item} </foreach> </select>
2. 當查詢的參數有多個時,例如 findByIds(String name, Long[] ids)這種情況需要特別注意,在傳參數時,一定要改用Map方式, 這樣在collection屬性可以指定名稱下面是一個示例Map<String, Object> params = new HashMap<String, Object>(2);params.put("name", name);params.put("ids", ids);mapper.findByIdsMap(params);<select id="findByIdsMap" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from jria where ID in <foreach item="item" index="index" collection="ids" open="(" separator="," close=")"> #{item} </foreach> </select>