MyBatis 批量操作、集合遍历-foreach
在使用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>
这里我传递的参数是List,所有parameterType为java.util.List
在<insert>或其他mybatis的标签中,可以写多个SQL语句,数据库会依次执行,记得一个语句结束后用分号结尾
foreach中collection的内容(worksList),就是传递的参数的名字
separator表示用两个对象之间用逗号相隔,即:insert into xxx(column1,column2,column3) values(...), (...), (...)
item就有点像:for(Works item : worksList) { ... }
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的更多相关文章
- - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD
目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 问题重现 fail-fast remove/add 做了什么 正确姿势 直接使用普通 ...
- Java8 新特性 Stream Api 之集合遍历
前言 随着java版本的不断更新迭代,java开发也可以变得甜甜的,最新版本都到java11了,但是后面版本也是不在提供商用支持,需要收费,但是java8 依然是持续免费更新使用的,后面版本也更新很快 ...
- MyBatis参数传入集合之foreach动态sql
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...
- 随心所欲~我也做个集合遍历器吧(自己的foreach,委托的威力)
感觉微软在面向对象三大原则中,封装性运用的最为突出,它会将一些复杂的算法,结构,功能代码进行封装,让程序员在使用时十分得心应手,如关键字里的foreach和labmda表达式里的Foreach等等,今 ...
- MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】
(第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...
- mybatis判断集合为空或者元素个数为零
mybatis判断集合为空或者元素个数为零: <if test="mlhs != null and mlhs.size() != 0"> and t.mlh_name ...
- 2018/1/8 学习汇总,kettle简单介绍,集合遍历方式的选择及原理,防止表单重复提交的后台解决方案
昨天因为当前这个二次开发项目的接近尾声,要求我们将生产环境数据库里的数据迁移到现在新的数据库来,但老数据库里是sqlserver而新数据库则是ORACLE,不仅仅面对着数据库数据类型结构不一致的问题, ...
- mybatis动态sql之foreach标签
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...
- MyBatis传入集合 list 数组 map参数的写法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...
随机推荐
- VUE环境配置——运行Demo
如果有Vue的Demo 不知道怎么运行的同学可以看这里 这里只讲Win下面环境配置 一.NodeJs安装 1.下载Windows 安装包(.msi),并安装https://nodejs.org/d ...
- Getting Started With setuptools and setup.py
https://pythonhosted.org/an_example_pypi_project/setuptools.html http://www.ianbicking.org/docs/setu ...
- iOS多线程--深度解析
多线程 你们项目中为什么多线程用GCD而不用NSOperation呢? 你有没有发现国外的大牛他们多线程都是用NSOperation? 你能告诉我他们这样做的理由吗? 关系: ①:先搞清两者的关系,N ...
- shell中条件判断语法与判断条件小结
1. IF条件判断语法: if Athen dosthelif B dosthelse dosthfi 2. 判断条件: 2.1 字符串判断 str1 = str2 当两个串有相同 ...
- 二维,多维数组排序array_multisort()函数的使用
对于数组的排序,很很多方法:随便百度了一下 sort() - 以升序对数组排序 rsort() - 以降序对数组排序 asort() - 根据值,以升序对关联数组进行排序 ksort() - 根据键, ...
- JavaScript DOM 编程艺术(1)---> JavaScript语法
一. JavaScript语法目录 语法 操作 条件语句 循环语句 函数 对象 二. 具体内容 2.1 语法 javaScript代码要通过HTML/XHTML文档才能执行.可以有两种方式完成这一 ...
- C#winform程序安装在默认路径提示权限不足的问题
这个需要以管理员身份运行即可.在program.cs里面修改即可也可以在别的地方,如:C# 编程中可以使程序自动使用管理员身份运行,也就是我们常常看到一些程序的图标上会冒出个盾牌.方法:在源码的Pro ...
- VMWare安装Win10虚拟机
这两天突发奇想安了个win10虚拟机,在安装的过程中还遇到了不少麻烦,所以在此与大家分享下. 首先我们用VMWare12来安装,VMWare已经更新到14但是不太稳定,所以为了保险起见还是用12吧. ...
- 如何利用panel在一个窗口中实现诸多页面的显示
Book_register form11 = new Book_register();//new一个对象 form11.TopLevel = false;//去除子窗体的顶级窗体设置 form11.P ...
- php执行linux命令的6个函数
一般情况下,很少会用php去执行linux命令,不过特殊情况下,你也许会用到这些函数.以前我知道有二个函数可以执行linux命令,一个是exec,一个是shell_exec.其实有很多的,结合手册内容 ...