室内设计小程序开发-创造独特的空间体验
981
2022-12-04
深入浅析MyBatis foreach标签
前面我们学习了如何使用 Mybatis if、where、trim 等动态语句来处理一些简单的查询操作。对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。
Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。
SELECT * FROM product_
WHERE ID in
open="(" separator="," close=")"> #{item}
open="(" separator="," close=")">
#{item}
如例,如图查询出id等于1,3,5的数据出来。
foreach 标签主要有以下属性,说明如下。
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名字,表示在迭代过程中每次迭代到的位置。
open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
jvynuJx 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://biancheng-/ | 10 | CN | 2021-02-23 10:20:40 |
| 2 | C语言中文网 | http://c.biancheng-/ | 12 | CN | 2021-03-08 11:23:27 |
| 3 | 百度 | https://baidu.com/ | 18 | CN | 2021-03-08 11:23:53 |
| 4 | 淘宝 | https://taobao.com/ | 17 | CN | 2021-03-10 10:33:54 |
| 5 | Google | https://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://yandex.ru/ | 11 | RU | 2021-03-10 10:34:34 |
+----+----------------+----------------------------+-----+---------+---------------------+
WebsiteMapper.xml 中代码如下。
parameterType="net.biancheng.po.Website"
resultType="net.biancheng.po.Website">
SELECT id,name,url,age,country
FROM website WHERE age in
separator="," close=")"> #{age}
separator="," close=")">
#{age}
WebsiteMapper 类中相应方法如下。
public List
测试代码如下。
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
ageList.add(10);
ageList.add(12);
List
for (Website ws : siteList) {
System.out.println(ws);
}
}
}
输出结果如下。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~