閱讀文本大概須要3分鐘。程序員
在作mybatis的mapper.xml文件的時候,時常遇到一些須要批量操做的狀況,這個時候mybatis的foreach標籤就派上用場了。web
foreach元素的屬性主要有item,index,collection,open,separator,close。
sql
item:集合中元素迭代時的別名,該參數爲必選。數組
index:在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選微信
open:foreach代碼的開始符號,通常是(和close=")"合用。經常使用在in(),values()時。該參數可選mybatis
separator:元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用「,「隔開,避免手動輸入逗號致使sql錯誤,如in(1,2,)這樣。該參數可選。架構
close: foreach代碼的關閉符號,通常是)和open="("合用。經常使用在in(),values()時。該參數可選。app
collection: 要作foreach的對象,做爲入參時,List對象默認用"list"代替做爲鍵;數組對象有"array"代替做爲鍵;Map對象沒有默認的鍵。固然在做爲入參時能夠使用@Param("keyName")來設置鍵,設置keyName後,list和array將會失效。除了入參這種狀況外,還有一種做爲參數對象的某個字段的時候。舉個例子:若是User有屬性List ids。入參是User對象,那麼這個collection = "ids"。若是User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id"編輯器
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,可是在不一樣狀況下,該屬性的值是不同的,主要有如下3種狀況: url
若是傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list 。
若是傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array 。
若是傳入的參數是多個的時候,就須要把它們封裝成一個Map了,固然單參數也能夠封裝成Map。實際上若是在傳入參數的時候,在MyBatis裏面也是會把它封裝成一個Map的,map的key就是參數名,因此這個時候collection屬性值就是傳入的List或array對象在本身封裝的map裏面的key。
0x01:傳入的參數爲List
對應的Dao中的Mapper文件是:
public List<User> selectByIds(List<Integer> userIds);
xml文件代碼片斷:
<select id="selectByIds" resultType="com.olive.pojo.User">
select * from t_user where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
0x02: 傳入的參數爲Array
對應的Dao中的Mapper文件是:
public List<User> selectByIds(int[] userIds);
xml文件代碼片斷:
<select id="selectByIds" resultType="com.olive.pojo.User">
select * from t_user where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
0x03: 傳入的參數爲Map
對應的Dao中的Mapper文件是:
public List<User> selectByIds(Map<String, Object> params);
xml文件代碼片斷:
<select id="selectByIds" resultType="com.olive.pojo.User">
select * from t_user where id in
<foreach collection="userIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
Map的時候須要注意的是:collection的值ids是存儲在map中的key,好比:
map.put("userIds",userIds));
尤爲須要注意;
☆
往期精彩
☆
關注我
天天進步一點點
本文分享自微信公衆號 - JAVA樂園(happyhuangjinjin88)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。