MyBatis foreach标签

前面我们学习了如何使用 Mybatis ifwheretrim 等动态语句来处理一些简单的查询操作。对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。 

Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。

  • <foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
  • 参数值
  • </foreach>

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。

示例

本节示例基于《Mybatis简单示例程序》一节的代码实现。

现有 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 中代码如下。

  1. <select id="selectWebsite"
  2. parameterType="net.biancheng.po.Website"
  3. resultType="net.biancheng.po.Website">
  4. SELECT id,name,url,age,country
  5. FROM website WHERE age in
  6. <foreach item="age" index="index" collection="list" open="("
  7. separator="," close=")">
  8. #{age}
  9. </foreach>
  10. </select>

WebsiteMapper 类中相应方法如下。

  • public List<Website> selectWebsite(List<Integer> ageList);

测试代码如下。

  1. public class Test {
  2. public static void main(String[] args) throws IOException {
  3. // 读取配置文件mybatis-config.xml
  4. InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
  5. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
  6. // 通过SqlSessionFactory创建SqlSession
  7. SqlSession ss = ssf.openSession();
  8. List<Integer> ageList = new ArrayList<Integer>();
  9. ageList.add(10);
  10. ageList.add(12);
  11. List<Website> siteList = ss.selectList("net.biancheng.mapper.WebsiteMapper.selectWebsite", ageList);
  12. for (Website ws : siteList) {
  13. System.out.println(ws);
  14. }
  15. }
  16. }

输出结果如下。

DEBUG [main] - ==>  Preparing: SELECT id,name,url,age,country FROM website WHERE age in ( ? , ? )
DEBUG [main] - ==> Parameters: 10(Integer), 12(Integer)
DEBUG [main] - <==      Total: 2
Website[id=1,name=编程帮,url=https://www.biancheng.net/,age=10,country=CN]
Website[id=2,name=C语言中文网,url=http://c.biancheng.net/,age=12,country=CN]

拓展

在使用 foreach 标签时,应提前预估一下 collection 对象的长度。因为大量数据的 in 语句会影响性能,且还有一些数据库会限制执行的 SQL 语句长度。

腾讯云推出云产品限时特惠抢购活动:2C2G云服务器7.9元/月起
本文链接:https://www.jhelp.net/p/0OcpLjUO6do8VYgB (转载请保留)。
关注下面的标签,发现更多相似文章