在使用mybatis操作数据库时,经常会使用到批量插入、IN条件查询的情况,这时就难免要使用到foreach元素。下面一段话摘自mybatis官网:

foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

图例

接口定义

实现

批量插入

void batchInsertWorks(@Param("empNo") String empNo, List<Works> worksList);
<insert id="batchInsertWorks" parameterType="java.util.List">
delete from mf_works_schedule where emp_no = #{empNo};
insert into mj_works(id_, emp_no, rest_day, rest_date, update_time)
values
<foreach collection ="worksList" item="item" index= "index" separator =",">
(
#{item.id}, #{item.empNo}, #{item.restDay},#{item.restDate}, now()
)
</foreach >
ON DUPLICATE KEY UPDATE update_time=now();
</insert>
  1. 这里我传递的参数是List,所有parameterType为java.util.List

  2. 在<insert>或其他mybatis的标签中,可以写多个SQL语句,数据库会依次执行,记得一个语句结束后用分号结尾

  3. foreach中collection的内容(worksList),就是传递的参数的名字

  4. separator表示用两个对象之间用逗号相隔,即:insert into xxx(column1,column2,column3) values(...), (...), (...)

  5. item就有点像:for(Works item : worksList) { ... }

  6. index在List和数组中,表示元素的序号,在map中,index表示元素的key

IN查询、删除

List<Order> queryByAppointmentDate(@Param("dateArray") String[] dateArray);
<select id="queryByAppointmentDate" resultMap="xxx.xxx.xxx.Order">
select * from mj_order where appointment_date in
<foreach collection="dateArray" item="item" index="index" open="(" separator="," close=")">
(
#{item}
)
</foreach>
</select>

这里的foreach参数和批量插入类似,多了个open和close,分表表示该语句从什么时候开始,什么时候结束

删除也类似:

void deleteEmpRestInfo(@Param("idArray") String[] idArray);
<delete id="deleteEmpRestInfo">
delete from mj_works where id_ in
<foreach collection="idArray" item="item" index="index" open="(" separator="," close=")">
(
#{item}
)
</foreach>
</delete>

批量更新参数传入的是map写法

/**
* @Author: Wu
* @Description: 批量更新
* @Date:
*/
@Test
public void deleteByUpdates(){
Map<String,Object> map =new HashMap<>();
List list=new ArrayList();
list.add();
list.add();
map.put("status",);
map.put("list",list);
int a= terminalPrivilegesMapper.updateStatus(map);
System.out.println(a); <!--批量更新状态-->
<update id="updateStatus" parameterType="java.util.Map">
UPDATE INFO_TERMINALPRIVILEGES SET STATUS = #{status}
WHERE ID IN
<foreach item="item" collection="list" separator="," open="(" close=")">
#{item,jdbcType=DECIMAL}
</foreach>
</update>

批量更新传入参数为list写法

<!-- 批量逻辑删除信息 -->
<update id="logicDeletes" parameterType="list">
UPDATE INFO_TERMINALTYPE SET DELETED = WHERE ID IN
<foreach item="item" collection="list" separator="," open="(" close=")">
#{item,jdbcType=DECIMAL}
</foreach>
</update>

MyBatis 批量操作、集合遍历-foreach的更多相关文章

  1. - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD

    目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 问题重现 fail-fast remove/add 做了什么 正确姿势 直接使用普通 ...

  2. Java8 新特性 Stream Api 之集合遍历

    前言 随着java版本的不断更新迭代,java开发也可以变得甜甜的,最新版本都到java11了,但是后面版本也是不在提供商用支持,需要收费,但是java8 依然是持续免费更新使用的,后面版本也更新很快 ...

  3. MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...

  4. 随心所欲~我也做个集合遍历器吧(自己的foreach,委托的威力)

    感觉微软在面向对象三大原则中,封装性运用的最为突出,它会将一些复杂的算法,结构,功能代码进行封装,让程序员在使用时十分得心应手,如关键字里的foreach和labmda表达式里的Foreach等等,今 ...

  5. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  6. mybatis判断集合为空或者元素个数为零

    mybatis判断集合为空或者元素个数为零: <if test="mlhs != null and mlhs.size() != 0"> and t.mlh_name ...

  7. 2018/1/8 学习汇总,kettle简单介绍,集合遍历方式的选择及原理,防止表单重复提交的后台解决方案

    昨天因为当前这个二次开发项目的接近尾声,要求我们将生产环境数据库里的数据迁移到现在新的数据库来,但老数据库里是sqlserver而新数据库则是ORACLE,不仅仅面对着数据库数据类型结构不一致的问题, ...

  8. mybatis动态sql之foreach标签

    foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...

  9. MyBatis传入集合 list 数组 map参数的写法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...

随机推荐

  1. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...

  2. Python之getopt模块

    1.getopt——C风格命令行解析 http://docs.python.org/2.7/library/getopt.html#module-getopt getopt.getopt(args, ...

  3. select * from 的一些心得

    如何简单运用好 select * from语句,在不同的函数下,有不同的先后顺序. 语法格式 (代表先后顺便) (2)select 字段名 查询什么东西 (1)from 表名,从哪个表查询 例如:查询 ...

  4. 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类

    背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...

  5. 调试利器:SSH隧道

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文作者:ivweb 吴浩麟 原文出处:IVWEB社区 未经同意,禁止转载 在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需 ...

  6. 浅谈IM(InstantMessaging) 即时通讯/实时传讯【理论篇】

        一.IM简要概述 IM InstantMessaging(即时通讯,实时传讯)的缩写是IM,互动百科大致解释是一种可以让使用者在网络上建立某种私人聊天(chatroom)的实时通讯服务. 大部 ...

  7. 初学PHP心得(第一天)

    我是PHP初学者,听说女生挺适合学这门语言的.所以,我就下定决心,来好好的探究下它,希望它能成为我开启IT道路的第一道关卡. 今天心血来潮,来记录下一天的成果和收获吧.既然想法有了,那就要去实现它.于 ...

  8. RHCE之配置autofs远程挂载远程服务器的家目录

    [root@server0 ~]# yum -y install autofs              安装包 [root@server0 ~]# vim /etc/auto.master      ...

  9. PHP入门怎么选?大学生适合学习吗?

    大学毕业,面对竞争激烈的社会,理想总是很丰满,现实却很残酷.在硕士.博士都随处可见的今天,本科和大专文凭就显得苍白无力,在面试官问你"有没有工作经验"的时候,你是不是只想起实习期间 ...

  10. 第四届河南省ACM SUBSTRING 字符串处理

    SUBSTRING 时间限制: 1 Sec  内存限制: 128 MB 提交: 17  解决: 5 [提交][状态][讨论版] 题目描述 You are given a string input. Y ...