Mybatis——foreach用法

Mybatis——foreach用法在做 mybatis 的 mapper xml 文件的时候 时常遇到一些需要批量操作的情况 这个时候 mybatis 的 foreach 标签就派上用场了 foreach 元素的属性主要有 item index collection open separator close item 集合中元素迭代时的别名 该参数为必选 index 在 list 和数组中 index 是元素的序号 在 map 中 index 是元素的 key 该参数可选 open foreach 代码的开始符号 一般是 和 clos

目录

1. foreach元素的属性

2.foreach时,collection属性值的三种情况:

3.代码示例:

3.1 collection属性值类型为List:

使用@Param注解自定义keyName;

使用默认属性值list作为keyname

3.2 collection属性值类型为Array:

使用@Param注解自定义keyName;

使用默认属性值array作为keyname

3.3 collection属性值类型为Map

第一种:获取Map的键值对

第二种:参数Map类型,只需要获取key值或者value值


在mybatis的xml文件中构建动态sql语句时,经常会用到标签遍历查询条件。特此记录下不同情况下书写方式!——-仅供大家参考——

1. foreach元素的属性

  • collection: 需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用”list”、”array”代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效;
  • item: 集合元素迭代时的别名称,该参数为必选项;
  • index: 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
  • open: 遍历集合时的开始符号,通常与close=”)”搭配使用。使用场景IN(),values()时,该参数为可选项;
  • separator: 元素之间的分隔符,类比在IN()的时候,separator=”,”,最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;
  • close: 遍历集合时的结束符号,通常与open=”(“搭配使用,该参数为可选项;

2.foreach时,collection属性值的三种情况

  • 如果传入的参数类型为List时,collection的默认属性值为list,同样可以使用@Param注解自定义keyName;
  • 如果传入的参数类型为array时,collection的默认属性值为array,同样可以使用@Param注解自定义keyName;
  • 如果传入的参数类型为Map时,collection的属性值可为三种情况:(1.遍历map.keys;2.遍历map.values;3.遍历map.entrySet()),稍后会在代码中示例;

3.代码示例:

3.1 collection属性值类型为List:

使用@Param注解自定义keyName;

Mapper接口定义的方法:UserList为模拟返回的数据对象

List<UserList> getUserInfo(@Param("userName") List<String> userName); 
 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <if test="userName!= null and userName.size() >0"> USERNAME IN <foreach collection="userName" item="value" separator="," open="(" close=")"> #{value} </foreach> </if> </select> 

使用默认属性值list作为keyname

 对应的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>

3.2 collection属性值类型为Array:

使用@Param注解自定义keyName;

Mapper接口定义的方法:UserList为模拟返回的数据对象

List<UserList> getUserInfo(@Param("userName") String[] userName); 
 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <if test="userName!= null and userName.length() >0"> USERNAME IN <foreach collection="userName" item="value" separator="," open="(" close=")"> #{value} </foreach> </if> </select> 

使用默认属性值array作为keyname

 对应的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> 

3.3 collection属性值类型为Map

List<UserList> getUserInfo(@Param("user") Map<String,String> user); 

第一种:获取Map的键值对

多字段组合条件情况下,一定要注意书写格式:括号()

eg: SELECT * FROM user_info WHERE (USERNAME,AGE) IN (('张三','26'),('李四','58'),('王五','27'),......); 
 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <if test="user!= null and user.size() >0"> (USERNAME,AGE) IN <foreach collection="user.entrySet()" item="value" index="key" separator="," open="(" close=")"> (#{key},#{value}) </foreach> </if> </select> 

第二种:参数Map类型,只需要获取key值或者value值

key:

 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <if test="user!= null and user.size() >0"> (USERNAME) IN <foreach collection="user.keys" item="key" separator="," open="(" close=")"> #{key} </foreach> </if> </select> 

value:

 <select id="getUserInfo" resultType="com.test.UserList"> SELECT * FROM user_info where <if test="user!= null and user.size() >0"> (USERNAME) IN <foreach collection="user.values" item="value" separator="," open="(" close=")"> #{key} </foreach> </if> </select> 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231149.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月25日 下午1:01
下一篇 2026年1月25日 下午1:22


相关推荐

  • Degenerate_generate动词

    Degenerate_generate动词22. Generate Parentheses C++回溯法

    2022年4月20日
    53
  • ubuntu14.04使用reaver跑pin码

    ubuntu14.04使用reaver跑pin码今天刚说过没找到支持ubuntu14.04用reaver跑pin的旧版库文件这就有摸索到方法了…另外安装系统ubuntu14.04以及一系列破解工具比如aircrack,minidwep等都不在本贴中赘述了,百度有很多,也可以直接在终端使用命令”apt-getinstall软件包”来安装,不过不要安装reaver,本贴主要讲安装reaver和库文件等上面说的你都安装完了之后,去h

    2022年5月4日
    49
  • matlab 半正定规划,半正定规划

    matlab 半正定规划,半正定规划已有半正定规划的代码现在要求添加几段代码条件的已知节点的位置是有误差的 代码中已知节点的位置是没有误差的 急求 SDPformtic clearall M 8 numberofthes 传感器节点的数量 delta 0 0005delta 1e 6 thepenaltyfa 惩罚因子 sigma n 10 0 5

    2026年3月17日
    1
  • elasticsearch集群安装插件滚动重启步骤「建议收藏」

    elasticsearch集群安装插件滚动重启步骤「建议收藏」elasticsearch集群安装插件滚动重启步骤1.先安装好插件(每个节点都要装,root用户执行)2.禁用分片分配。这可以防止Elasticsearch重新平衡(reblance)丢失的分片,可以按如下方式禁用分配3.为了提升集群恢复速度,尽可能先让数据刷盘.如果有任何挂起(pending状态)的索引操作,这个操作将会失败,但可以安全地多次重新执行.如果应用有数据写入最好先暂时停止数据写入4.重启节点确认是否已经加入集群5.重新启用分片分配,分片再平衡可能需要一些时间。等待群集恢复到green状态后再继

    2025年8月3日
    5
  • 静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响

    静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响静态内部类访问包含它的外部类的非静态成员变量时,可以通过new外部类().成员的方式访问,这是因为静态的只能访问静态的,因为他们在对象没创建前就存在了。如果想访问非静态的则必须初始化该对象,因为只有初始化后对象在内存才存在(静态的除外)…

    2022年8月31日
    12
  • c语言心形曲线_c语言怎么画心

    c语言心形曲线_c语言怎么画心原理:利用内嵌循环绘制方程:(x2+y2−1)3=x2y3(x^2+y^2-1)^3=x^2y^3(x2+y2−1)3=x2y3的图像代码:/*说明:本程序的原理是根据方程(x^2+y^2-1)^3=x^2*y^3作差得值f,若f<=0,则用’*’填充,否则就用”填充最后得到了心形曲线*/#include<cstdio>#include<iostream>usingnamespacestd;intmain(){float

    2022年8月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号