mybatis foreach标签的使用详解

作者:wt_better 时间:2023-05-07 21:12:09 

mybatis的foreach标签经常用于遍历集合,构建in条件语句或者批量操作语句。

下面是foreach标签的各个属性

属性描述
collection表示迭代集合的名称,可以使用@Param注解指定,如下图mybatis foreach标签的使用详解所示 该参数为必选
item表示本次迭代获取的元素,若collection为List、Set或者数组,则表示其中的元素;若collection为map,则代表key-value的value,该参数为必选
open表示该语句以什么开始,最常用的是左括弧'(',注意:mybatis会将该字符拼接到整体的sql语句之前,并且只拼接一次,该参数为可选项
close表示该语句以什么结束,最常用的是右括弧')',注意:mybatis会将该字符拼接到整体的sql语句之后,该参数为可选项
separatormybatis会在每次迭代后给sql语句append上separator属性指定的字符,该参数为可选项
index在list、Set和数组中,index表示当前迭代的位置,在map中,index代指是元素的key,该参数是可选项。

假设接口中传递的list如下所示:


List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");

其中foreach标签配置如下:


<foreach collection="list" item="item" separator=",">
(#{item})
</foreach>

可以看到的是foreach标签指定了逗号作为分隔符,那么mybatis将会解析出foreach标签里面的内容作为一个整体然后再其后面拼接上逗号分隔符,拼接后的过程如下所示:


('zhangsan')    //第一步,迭代集合,获取对应的item,和外部的(),拼接形成('zhangsan')
('zhangsan'),   //第二步,在之前的基础上拼接上逗号分隔符
('zhangsan'),('lisi')    //第三步,继续迭代
('zhangsan'),('lisi'),    //第四步,拼接逗号分隔符
('zhangsan'),('lisi'),('wangwu') //第五步,迭代集合并拼接,到此迭代结束

最终的结果为

('zhangsan'),('lisi'),('wangwu')

如果在foreach标签前面加上insert into table values,将会变形成


INSERT INTO user(user_name) VALUES('zhangsan'),('lisi'),('wangwu')
1

这种形式一般用于数据库的批量增加。

如果将foreach配置修改如下,指定open属性为左括弧,close属性为右括弧:


<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>

那么拼接的过程如下所示


(        //第一步,拼接open指定的开始字符
('zhangsan' //第二步,迭代集合,拼接对应的item
('zhangsan', //第三步,拼接separator指定的分隔符
('zhangsan','lisi' //第四步,迭代集合,拼接对应的item
('zhangsan','lisi', //第五步,拼接separator指定的分隔符
('zhangsan','lisi','wangwu'  //第六步,迭代集合,拼接对应的item
('zhangsan','lisi','wangwu') //第七步,拼接close指定的闭合字符

最终结果是:

('zhangsan','lisi','wangwu')

如果在foreach标签前面加上select … from table where … in ,将会变形成


SELECT * FROM user WHERE user_name in ('zhangsan','lisi','wangwu')

这种形式被用来构建in条件语句。

如果collection类型为map,则index代表key,item代表对应的value,可以这样进行批量插入:

mybatis foreach标签的使用详解

其中Role实体类如下:

mybatis foreach标签的使用详解

如果你想了解更多的关于mybaits标签的使用,请移步mybatis trim标签的使用
本文参考mybatis官方文档

来源:https://blog.csdn.net/wt_better/article/details/80941646

标签:mybatis,foreach标签
0
投稿

猜你喜欢

  • 关于SpringMVC的异常处理机制详细解读

    2023-01-26 17:32:45
  • C# 指针内存控制Marshal内存数据存储原理分析

    2021-09-22 04:05:00
  • Java Hutool工具实现验证码生成及Excel文件的导入和导出

    2023-02-04 22:49:32
  • Android游戏开发学习②焰火绽放效果实现方法

    2023-10-26 08:54:53
  • Java Kafka分区发送及消费实战

    2022-08-17 20:27:58
  • Java基于Swing实现的打猎射击游戏代码

    2021-06-29 17:04:56
  • Android如何利用RecyclerView实现列表倒计时效果实例代码

    2023-01-24 08:08:53
  • Android编程实现点击EditText之外的控件隐藏软键盘功能

    2022-08-07 02:06:08
  • springboot 使用mybatis查询的示例代码

    2022-03-30 03:19:09
  • Eclipse项目怎么导入IDEA并运行(超详细)

    2021-11-15 06:51:41
  • Android Studio配置国内镜像源(利用hosts)

    2023-05-29 18:47:54
  • c#中Invoke与BeginInvoke的用法及说明

    2023-06-10 12:39:49
  • 详解SpringMVC和MyBatis框架开发环境搭建和简单实用

    2022-03-11 13:54:51
  • java使用Cookie判断用户登录情况的方法

    2021-11-28 15:12:40
  • 简单谈谈java中匿名内部类构造函数

    2021-09-08 18:54:10
  • 从字符串中截取等长字节的Java代码

    2023-03-12 10:11:41
  • VisualStudio Community2019在安装的过程中无法进入安装界面的解决方法

    2023-02-09 11:24:34
  • 关于IDEA2020.1新建项目maven PKIX 报错问题解决方法

    2023-12-26 14:04:44
  • SpringMVC的执行过程浅析

    2021-05-31 20:51:11
  • Spring4整合Hibernate5详细步骤

    2022-03-15 16:53:07
  • asp之家 软件编程 m.aspxhome.com