mybatis foreach标签的使用详解

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

其中Role实体类如下:

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

到此这篇关于mybatis foreach标签的使用详解的文章就介绍到这了,更多相关mybatis foreach标签内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis foreach标签使用不当导致异常的原因浅析

    异常产生场景及异常信息 上周,由于在Mybatis的Mapper接口方法中使用实现了Map.Entry接口的泛型类,同时此方法对应的sql语句也使用了foreach标签,导致出现了异常.如下为异常信息: org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no

  • Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    原因 在自已做的内容中通过获取多个商品Id,以此来获取多个商品详细信息.但数据库返回的商品信息的顺序与原来List中产品的id顺序并不匹配,这就导致了前端页面商品的信息显示混乱,不匹配. 通过网上找到order by排序可以有效解决这个问题,返回与查询时的产品id顺序一致.还有一点,List时有序的 这里先附带上这个sql语句(只能在数据库中成功) select prod_id, prod_name, price, `describe`, prod_date, prod_pic, integra

  • mybatis foreach标签的使用详解

    mybatis的foreach标签经常用于遍历集合,构建in条件语句或者批量操作语句. 下面是foreach标签的各个属性 属性 描述 collection 表示迭代集合的名称,可以使用@Param注解指定,如下图所示 该参数为必选 item 表示本次迭代获取的元素,若collection为List.Set或者数组,则表示其中的元素:若collection为map,则代表key-value的value,该参数为必选 open 表示该语句以什么开始,最常用的是左括弧'(',注意:mybatis会将

  • mybatis trim标签的使用详解

    mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 "where"."set"以及"values(" 等前缀,或者添加")"等后缀,可用于选择性插入.更新.删除或者条件查询等操作. 以下是trim标签中涉及到的属性: 属性 描述 prefix 给sql语句拼接的前缀 suffix 给sql语句拼接的后缀 prefixOverrides 去除sql语句前面的关键字或者字符,该关键

  • MyBatis动态SQL标签的用法详解

    1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

  • MyBatis动态SQL标签用法实例详解

    1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from icp <dynamic prepend="where&quo

  • MyBatis动态Sql之if标签的用法详解

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用if标签生成动态的Sql,主要包含以下3个场景: 1.根据查询条件实现动态查询 2.根据参数值实现动态更新某些列 3.根据参数值实现动态插入某些列 1. 使用if标签实现动态查询 假设有这样1个需求:根据用户的输入条件来查询用户列表,如果输入了用户名,就根据用户名模糊查询,如果输入了邮箱,就根据邮箱精确查询,如果同时输入了

  • mybatis的mapper.xml中resultMap标签的使用详解

    1.前言 最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null的情况.或者是resultMap标签和驼峰规则不太明白的同学,可以看这里. 于是顺便梳理一下. 2.关于resultMap 2.1.什么是resultMap? 在mybatis中有一个resultMap标签,它是为了映射select查询出来结果的集合,其主要作用是将实体类中的字段与数据库表中的字段进

  • Mybatis中Collection集合标签的使用详解

    mybatis简单的CURD就不用多说了,网上相关博客文档一大堆.分析一下Mybatis里面的collection聚集查询. 假设一个班级有多名学生为例,通过班级号查询出该班级的信息,和班级里面的所有学生的信息,一般的做法就是通过班级号把班级的信息查询出来,再通过班级ID号把该班级里面的所有学生查询出来,我们不用这种通用的方法 1.班级实体类可以定义为这样: import java.util.List; public class ClazzEntity { private int clazzID

  • mybatis plus in方法使用详解

    如果是List类型的String,例如:List<String>这种类型的,就直接放值就可以了,本文讲的是当你查询到的是一个list集合如何遍历取值,否则要写sql和接口就显得很麻烦. 步骤如下: //查询到list集合 List<User> userList = userService.selectById(id); //结果集 List<String> resultList = new ArrayList<>(); //遍历集合取值 userList .

  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    一直想写这篇文章,前段时间痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams/quick4j 点击打开 源码地址:https://gi

  • MyBatis 执行动态 SQL语句详解

    大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

随机推荐