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

下面是foreach标签的各个属性

属性 描述
collection 表示迭代集合的名称,可以使用@Param注解指定,如下图所示,如果没有用param指定,则表示集合的类型,list,array,map
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<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')

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

果将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,可以这样进行批量插入:

其中Role实体类如下:

mybatis foreach标签的使用相关推荐

  1. MyBatis foreach 标签常用方法总结

    一.前言   在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合.foreach 标签就是专门用来解决这类问 ...

  2. mybatis foreach标签拼接多字段in ,和union

    mybatis for标签 手写肯定是不可能,复制又经常忘记哪里有,记录一下复制方便 (oracle数据库) 批量添加 ,修改 ,拼接(xx,xx)in , union 添加,修改: <fore ...

  3. MyBatis Foreach标签

    关于之前的trim标签 其作用在于可以自定义一个标签用于覆盖除去特定的字符 就如where标签 可以对and|or进行除去. 以下是sql片段 主要是利用<sql>标签: 将之前的动态sq ...

  4. mybatis where、set、trim、sql、foreach标签的使用

    mybatis where标签的使用 where后面跟查询条件 简化sql语句中判断条件的书写 例: <select id="user" parameterType=&quo ...

  5. Mybatis系列:解决foreach标签内list为空的问题

    我把之前发布在简书的两篇文章通过拦截器Interceptor优化Mybatis的in查询 和Mybatis中foreach标签内list为空的解决方案进行了整合,整理为本文的内容.此外,我还对代码部分 ...

  6. 框架:mybatis常用标签(refid、foreach、trim)

    1.mybatis中refid是什么意思 1.首先定义一个sql标签,一定要定义唯一id <sql id="Base_Column_List" >name,age< ...

  7. 【MyBatis框架】mapper配置文件-foreach标签

    foreach标签 下面介绍一下一个mapper配置文件中的foreach标签(注意,要跟着前面的总结来看,这里使用的例子是结合前面的工程写的,大部分代码没有再赘述) foreach的作用是向sql传 ...

  8. Mybatis之foreach标签

    Mybatis之foreach标签 案例:通过foreach标签实现如下sql查询,并在测试类中传入参数: select * from mybatis.blog where id in=(1 or 2 ...

  9. MyBatis学习——foreach标签的使用

    一.foreach标签属性解读 MyBatis的foreach标签应用于多参数的交互如:多参数(相同参数)查询.循环插入数据等,foreach标签包含collection.item.open.clos ...

  10. Mybatis动态sql中的foreach标签的使用

    foreach 标签一般用于遍历集合,构建in条件语句或者批量操作语句 <insert id="batchSave" parameterType="java.uti ...

最新文章

  1. 推荐一款非常好用的java反编译工具(转)
  2. start与run的区别
  3. poj 2777(线段树+区间染色)
  4. 【机器学习基础】xgboost系列丨xgboost建树过程分析及代码实现
  5. Django的信号机制详解
  6. vuex 在非组件中调用 mutations 方法
  7. HarmonyOS 2.0:正式开源,年底面向开发者发布智能手机 Beta 版本
  8. 谈谈我们的学习和我们的Blog
  9. Python 语言程序设计(3-1)字符串处理函数和相关功能
  10. iOS 常用到的宏#define
  11. (六)ModelSim 下载安装以及crack的注册
  12. tcp 三次握手和四次断连深入分析:连接状态和socket API的关系----BAT 李运华
  13. c语言-厘米换算英尺英寸
  14. the little schemer 学习
  15. (二) CGAL库应用:轮廓中轴骨架生成create_interior_straight_skeleton_2()及轮廓的偏置create_offset_polygons_2()
  16. On-Premise
  17. Android 点九图 .9图
  18. 什么是等级保护?等保二级和三级的区别?
  19. Android RecyclerView设置paddingBottom,scrollbars跟随滑动到底部
  20. 半导体|台积电今年上半年营收达1016亿元 同比减少4.5%

热门文章

  1. linux 字符驱动 tty,打通linux的tty驱动的数据链路
  2. ubuntu mysql双主热备配置_mysql学习:mysql双主热备+lvs+keepalived配置
  3. OpenCV对图片的读写,像素值的访问,修改
  4. 翻译: 3.7. Softmax 回归的简明实现 pytorch
  5. Layout anchors徒手写AutoLayout Swift
  6. Sourcetree 看不了文件内容 Diff was suppressed because of file size or pattern
  7. OperationQueue与属性maxConcurrentOperationCount的那些事
  8. linux build bash,Win10 Build 14316启用Linux Bash 环境图文教程
  9. 使用案例_Excel中LOOKUP函数的使用案例
  10. php_eol为什么没有换行,PHP PHP_EOL 换行符