网站首页 > 技术文章 正文
在做mybatis的mapper.xml文件的时候,时常遇到一些需要批量操作的情况,这个时候mybatis的foreach标签就派上用场了。
foreach元素的属性主要有item,index,collection,open,separator,close。
- item:集合中元素迭代时的别名,该参数为必选。
- index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
- open:foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选
- separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
- close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
- 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种情况:
- 如果传入的是单参数且参数类型是一个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));
尤其需要注意;
猜你喜欢
- 2024-10-02 掌控你的MySQL语句执行方案(如何让mysql执行脚本?)
- 2024-10-02 我爱Julia之入门-075(字符串05)
- 2024-10-02 Java入门超经典教程-数组的操作(java数组视频教学)
- 2024-10-02 AdaBoost算法(手稿+代码)(adaboost算法详解)
- 2024-10-02 有了for循环 为什么还要forEach?(为什么用for循环)
- 2024-10-02 UFS深入浅出 第二章 UFS结构 第三节 UFS分区
- 2024-10-02 Ruby 最常用指令和函数(备忘查询)
- 2024-10-02 MYSQL优化有理有据全分析(面试必备)
- 2024-10-02 最小优先队列 Index min priority queue
- 2024-10-02 mysql explain用法(mysql游标的定义与使用)
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 506℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 486℃MySQL service启动脚本浅析(r12笔记第59天)
- 466℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 464℃启用MySQL查询缓存(mysql8.0查询缓存)
- 444℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 423℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 419℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)