前面我們學習了如何使用 Mybatisif、where、trim 等動態語句來處理一些簡單的查詢操作。對于一些 SQL 語句中含有 in 條件,需要迭代條件集合來生成的情況,可以使用 foreach 來實現 SQL 條件的迭代。
Mybatis foreach 標簽用于循環語句,它很好的支持了數據和 List、set 接口的集合,并對此提供遍歷的功能。語法格式如下。
SELECT * FROM product_ WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach>
如例,如圖查詢出id等于1,3,5的數據出來。
foreach 標簽主要有以下屬性,說明如下。
- item:表示集合中每一個元素進行迭代時的別名。
- index:指定一個名字,表示在迭代過程中每次迭代到的位置。
-
open:表示該語句以什么開始(既然是 in 條件語句,所以必然以
(
開始)。 -
separator:表示在每次進行迭代之間以什么符號作為分隔符(既然是 in 條件語句,所以必然以
,
作為分隔符)。 -
close:表示該語句以什么結束(既然是 in 條件語句,所以必然以
)
開始)。
使用 foreach 標簽時,最關鍵、最容易出錯的是 collection 屬性,該屬性是必選的,但在不同情況下該屬性的值是不一樣的,主要有以下 3 種情況:
- 如果傳入的是單參數且參數類型是一個 List,collection 屬性值為 list。
- 如果傳入的是單參數且參數類型是一個 array 數組,collection 的屬性值為 array。
- 如果傳入的參數是多個,需要把它們封裝成一個 Map,當然單參數也可以封裝成 Map。Map 的 key 是參數名,collection 屬性值是傳入的 List 或 array 對象在自己封裝的 Map 中的 key。
在使用 foreach 標簽時,應提前預估一下 collection 對象的長度。因為大量數據的 in 語句會影響性能,且還有一些數據庫會限制執行的 SQL 語句長度。
使用foreach元素查詢用戶信息
現有 website 表包含以下記錄。
+----+----------------+----------------------------+-----+---------+---------------------+ | id | name | url | age | country | createtime | +----+----------------+----------------------------+-----+---------+---------------------+ | 1 | 編程幫 | https://www.biancheng.net/ | 10 | CN | 2021-02-23 10:20:40 | | 2 | C語言中文網 | 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 類中相應方法如下。
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"); // 根據配置文件構建 SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config); // 通過SqlSessionFactory創建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); } } }
輸出結果如下。
到此這篇關于MyBatis foreach標簽的文章就介紹到這了,更多相關MyBatis foreach標簽內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/m0_53698336/article/details/120541001