mybatis foreach标签的使用

mybatis foreach标签的使用mybatis 的 foreach 标签经常用于遍历集合 以便于构建 in 条件语句或者批量操作语句 下面是 foreach 标签的各个属性属性描述 collection 表示迭代集合的名称 item 表示本次迭代获取的元素 open 表示该语句以什么开始 close 表示该语句以什么结束 separator 表示元素之间

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

下面是foreach标签的各个属性

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

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

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

其中foreach标签配置如下:

 
    
      (#{item}) 
     

可以看到的是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') 

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


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

 
     
       #{item} 
      

那么拼接的过程如下所示

( //第一步,拼接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,可以这样进行批量插入:
这里写图片描述
其中Role实体类如下:
这里写图片描述





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

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

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

(0)
上一篇 2026年3月19日 上午9:07
下一篇 2026年3月19日 上午9:08


相关推荐

  • Glance源码结构分析

    Glance源码结构分析一 Glance 源码目录结构 root localhostgla tree L2 api ref source etc glance api conf glance api paste ini glance cache conf glance glare conf g

    2026年3月17日
    1
  • treap模版_bartender模板

    treap模版_bartender模板#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusingnamespacestd;typedefintll;typedefunsignedlonglongu

    2025年7月22日
    7
  • 麦克风声源定位原理_基于麦克风阵列的声源定位算法之GCC-PHAT

    麦克风声源定位原理_基于麦克风阵列的声源定位算法之GCC-PHAT目前基于麦克风阵列的声源定位方法大致可以分为三类:基于最大输出功率的可控波束形成技术、基于高分辨率谱图估计技术和基于声音时间差(time-delayestimation,TDE)的声源定位技术。基于TDE的算法核心在于对传播时延的准确估计,一般通过对麦克风间信号做互相关处理得到。进一步获得声源位置信息,可以通过简单的延时求和、几何计算或是直接利用互相关结果进行可控功率响应搜索等方法。这类算法实现…

    2026年2月13日
    5
  • redis 设置过期时间会立刻删除吗_redis默认过期时间是多少

    redis 设置过期时间会立刻删除吗_redis默认过期时间是多少3月,跳不动了?>>>…

    2026年4月13日
    3
  • WinAPI CreateThread

    WinAPI CreateThreadHANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);编辑本段参数说明…

    2022年7月11日
    18
  • 磁盘阵列技术

    磁盘阵列技术一、磁盘阵列实现方式磁盘阵列有两种方式可以实现,那就是“软件阵列”与“硬件阵列”。软件阵列是指通过网络操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成阵列。如微软的WindowsNT/2000Server/Server2003和NetVoll的NetWare两种操作系统都可以提供软件阵列功能,其中WindowsNT/2000Server/Serv

    2022年5月23日
    27

发表回复

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

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