深入淺析MyBatis foreach標(biāo)簽
前面我們學(xué)習(xí)了如何使用 Mybatis if、where、trim 等動(dòng)態(tài)語句來處理一些簡單的查詢操作。對(duì)于一些 SQL 語句中含有 in 條件,需要迭代條件集合來生成的情況,可以使用 foreach 來實(shí)現(xiàn) SQL 條件的迭代。
Mybatis foreach 標(biāo)簽用于循環(huán)語句,它很好的支持了數(shù)據(jù)和 List、set 接口的集合,并對(duì)此提供遍歷的功能。語法格式如下。

SELECT * FROM product_
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
如例,如圖查詢出id等于1,3,5的數(shù)據(jù)出來。

foreach 標(biāo)簽主要有以下屬性,說明如下。
- item:表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名。
- index:指定一個(gè)名字,表示在迭代過程中每次迭代到的位置。
- open:表示該語句以什么開始(既然是 in 條件語句,所以必然以
(開始)。 - separator:表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符(既然是 in 條件語句,所以必然以
,作為分隔符)。 - close:表示該語句以什么結(jié)束(既然是 in 條件語句,所以必然以
)開始)。
使用 foreach 標(biāo)簽時(shí),最關(guān)鍵、最容易出錯(cuò)的是 collection 屬性,該屬性是必選的,但在不同情況下該屬性的值是不一樣的,主要有以下 3 種情況:
- 如果傳入的是單參數(shù)且參數(shù)類型是一個(gè) List,collection 屬性值為 list。
- 如果傳入的是單參數(shù)且參數(shù)類型是一個(gè) array 數(shù)組,collection 的屬性值為 array。
- 如果傳入的參數(shù)是多個(gè),需要把它們封裝成一個(gè) Map,當(dāng)然單參數(shù)也可以封裝成 Map。Map 的 key 是參數(shù)名,collection 屬性值是傳入的 List 或 array 對(duì)象在自己封裝的 Map 中的 key。
在使用 foreach 標(biāo)簽時(shí),應(yīng)提前預(yù)估一下 collection 對(duì)象的長度。因?yàn)榇罅繑?shù)據(jù)的 in 語句會(huì)影響性能,且還有一些數(shù)據(jù)庫會(huì)限制執(zhí)行的 SQL 語句長度。
使用foreach元素查詢用戶信息
現(xiàn)有 website 表包含以下記錄。
+----+----------------+----------------------------+-----+---------+---------------------+ | id | name | url | age | country | createtime | +----+----------------+----------------------------+-----+---------+---------------------+ | 1 | 編程幫 | https://www.biancheng.net/ | 10 | CN | 2021-02-23 10:20:40 | | 2 | C語言中文網(wǎng) | http://c.biancheng.net/ | 12 | CN | 2021-03-08 11:23:27 | | 3 | 百度 | https://www.baidu.com/ | 18 | CN | 2021-03-08 11:23:53 | | 4 | 淘寶 | https://www.taobao.com/ | 17 | CN | 2021-03-10 10:33:54 | | 5 | Google | https://www.google.com/ | 23 | US | 2021-03-10 10:34:34 | | 6 | GitHub | https://github.com/ | 13 | US | 2021-03-10 10:34:34 | | 7 | Stack Overflow | https://stackoverflow.com/ | 16 | US | 2021-03-10 10:34:34 | | 8 | Yandex | http://www.yandex.ru/ | 11 | RU | 2021-03-10 10:34:34 | +----+----------------+----------------------------+-----+---------+---------------------+
WebsiteMapper.xml 中代碼如下。
<!--使用foreach元素查詢用戶信息-->
<select id="selectWebsite"
parameterType="net.biancheng.po.Website"
resultType="net.biancheng.po.Website">
SELECT id,name,url,age,country
FROM website WHERE age in
<foreach item="age" index="index" collection="list" open="("
separator="," close=")">
#{age}
</foreach>
</select>
WebsiteMapper 類中相應(yīng)方法如下。
public List<Website> selectWebsite(List<Integer> ageList);
測試代碼如下。
public class Test {
public static void main(String[] args) throws IOException {
// 讀取配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根據(jù)配置文件構(gòu)建
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
// 通過SqlSessionFactory創(chuàng)建SqlSession
SqlSession ss = ssf.openSession();
List<Integer> ageList = new ArrayList<Integer>();
ageList.add(10);
ageList.add(12);
List<Website> siteList = ss.selectList("net.biancheng.mapper.WebsiteMapper.selectWebsite", ageList);
for (Website ws : siteList) {
System.out.println(ws);
}
}
}
輸出結(jié)果如下。

到此這篇關(guān)于MyBatis foreach標(biāo)簽的文章就介紹到這了,更多相關(guān)MyBatis foreach標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot同時(shí)啟動(dòng)不同端口圖示解析
這篇文章主要介紹了SpringBoot同時(shí)啟動(dòng)不同端口圖示解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
淺析SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案
現(xiàn)在很多項(xiàng)目的開發(fā)過程中,可能涉及到多個(gè)數(shù)據(jù)源,像讀寫分離的場景,或者因?yàn)闃I(yè)務(wù)復(fù)雜,導(dǎo)致不同的業(yè)務(wù)部署在不同的數(shù)據(jù)庫上,那么這樣的場景,我們應(yīng)該如何在代碼中簡潔方便的切換數(shù)據(jù)源呢,本文介紹SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案,感興趣的朋友跟隨小編一起看看吧2024-02-02
淺析JAVA常用JDBC連接數(shù)據(jù)庫的方法總結(jié)
本篇文章是對(duì)在JAVA中常用JDBC連接數(shù)據(jù)庫的方法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下2013-07-07
Java Lambda表達(dá)式和函數(shù)式接口實(shí)例分析
這篇文章主要介紹了Java Lambda表達(dá)式和函數(shù)式接口,結(jié)合實(shí)例形式分析了Java8 Lambda表達(dá)式和函數(shù)式接口相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
java循環(huán)結(jié)構(gòu)、數(shù)組的使用小結(jié)
這篇文章主要介紹了java循環(huán)結(jié)構(gòu)、數(shù)組的使用小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
SpringBoot 監(jiān)控管理模塊actuator沒有權(quán)限的問題解決方法
這篇文章主要介紹了SpringBoot 監(jiān)控管理模塊actuator沒有權(quán)限的問題解決方法,需要的朋友可以參考下2017-12-12

