动态SQL Foreach批量操作

  • 前言
  • 前置必要知识
    • MySQL批量插入
    • MySQL批量查询
    • MySQL批量修改
    • MySQL批量删除
  • 使用mybatis中的foreach进行批量操作
    • foreach标签的各个属性
    • 批量插入
    • 批量查询
    • 批量修改
    • 批量删除
  • 总结

前言

最近正在研究Mybatis的动态SQL,正好学习到了foreach元素。之前也是在项目开发中经常会使用到Mybatis的foreach元素进行批量操作。但是有时候就会使用出错,所以整理和总结了关于使用foreach进行增删改查的方法。通过这篇博客详细对于foreach的使用将会更加熟练和高效。

前置必要知识

在学习Mybatis的foreach之前,我们需要掌握到mysql的批量语句是如何书写的。如果不清楚mysql批量语句怎么书写那么在使用Mybatis的foreach元素进行批量操作就跟无头苍蝇一样,原理很简单,mybatis是一种持久层框架,其中一个作用就是拼接SQL并交给数据库执行SQL,所以在mybatis中我们需要将批量的SQL语句拼接成功,所以就会用到批量操作的SQL怎么书写,然后才是怎么和Mybatis的语法结合。

让我们来看看批量的增删改查SQL语句如何书写和执行结果。

MySQL批量插入

INSERT INTO tar_course_content_info ( id, course_assembly_id, assembly_content, create_time, created_id, created_by, update_time, updated_id, updated_by, is_delete )
VALUES(301906655392563202,301906577433034752,'语文课','2022-07-12 19:13:44','EmE6TKu4okhu3qK5M1AGQ4','张三','2022-07-12 19:13:44','PWeDZyRPADjsdxCNWnSWxZ','王五',0 ),(301906655392563203,301906577433034752,'数学课','2022-07-12 19:13:44','EmE6TKu4okhu3qK5M1AGQ4','张三','2022-07-12 19:13:44','PWeDZyRPADjsdxCNWnSWxZ','王五',0 )

执行结果
已经受影响的行数为2行

MySQL批量查询

使用in关键字,in关键字的作用是查询某个范围内的数据

SELECT * FROM tar_course_content_info WHERE is_delete = 0 AND ( created_by, course_assembly_id ) IN (( '张三', 305107474690605056 ),( '李四', 308290117053710337 ))

执行结果

MySQL批量修改

UPDATE tar_course_content_info SET created_by='王五' WHERE  course_assembly_id IN( 305107474690605056,308290117053710337)

执行结果
已经受影响的行数为13行

MySQL批量删除

DELETE FROM tar_course_content_info where (created_by,id) in (('张三',301906655392563202),('张三',301906655392563203))

执行结果

知道mysql的sql语句的批量操作之后,我们再看看在实际项目开发过程中,如何使用mybatis中的foreach进行批量操作。

使用mybatis中的foreach进行批量操作

foreach标签的各个属性

collection表示迭代集合的名称
item 表示本次迭代的获取的元素,如果collection为List、Set、或者Array,则表示其中的元素;若collection为may,则表示key-value中的value,该参数为必选
open 表示该语句以什么开始,常用的为左括弧 “(”,mybatis会将该字符串拼接到foreach包裹的sql语句之前,并且只拼接一次,该参数为可选项。
close 表示该语句以什么借宿,常用的为右括弧")",mybatis会将该字符串拼接到foreach包裹的sql语句之后,并且只拼接一次,该参数为可选项。
separator mybatis会在每次迭代后给sql加上separate属性制定的字符,该参数为可选项。
index 在List、Set和Array表示当前迭代的位置,在Map中,index表示key-value中的key,该参数为可选项。
nullable 表示集合是否可以为null,默认为false,当设置为true时集合为null不抛出异常

批量插入

<!--批量插入--><insert id="insertBatch">INSERT INTO tar_course_content_info (id,course_assembly_id,assembly_content,create_time,created_id,created_by,update_time,updated_id,updated_by,is_delete) values<foreach collection="list" item="item"  separator="," >(   #{item.id},#{item.courseAssemblyId},#{item.assemblyContent},#{item.createTime},#{item.createdId},#{item.createdBy},#{item.updateTime},#{item.updatedId},#{item.updatedBy},#{item.iselete})</foreach></insert>

执行结果

批量查询

<!--根据创建人和课程组件id进行批量查询  --><select id="queryAllCourseContentByCreatedByAndCourseAssemblyId" resultMap="courseContentMap">SELECT *FROM  tar_course_content_infoWhEREis_delete=0and(created_by, course_assembly_id)in<foreach collection="list" item="item" open="(" close=")" separator="," nullable="false">(#{item.createdBy},#{item.courseAssemblyId})</foreach></select>

执行结果

批量修改

第一种情况是需更新的值相同:

<!--    根据创建人和内容id进行批量假删除--><update id="updateAllByCreatedByAndContentId">UPDATE tar_course_content_info SET is_delete=1 WHERE  (created_by,id) IN<foreach collection="list" item="item" open="(" close=")" separator="," >(#{item.createdBy},#{item.id})</foreach></update>

执行结果

第二种情况是需更新的值不同:
这里需要注意,需要在连接数据是添加 &allowMultiQueries=true
作用:可以执行批处理,同时发出多个SQL语句。也就是可以在sql语句后携带分号,实现多语句执行。

<!--    根据课程组件id批量修改创建人姓名--><update id="updateAllCreatedByByCourseAssemblyId" ><foreach collection="list" item="item" separator=";" >UPDATE tar_course_content_infoSETcreated_by = #{item.createdBy}WHEREcourse_assembly_id = #{item.courseAssemblyId}</foreach></update>

执行结果

批量删除

<!--    根据创建人和内容id进行批量删除--><delete id="deleteAllByCreatedByAndContentId">DELETE FROM tar_course_content_info where (created_by,id) in<foreach collection="list" item="item" open="(" close=")" separator="," nullable="false" index="index">(#{item.createdBy},#{item.id})</foreach></delete>

执行结果

总结

  1. 学习一个新东西的时候,需要思考的是有哪些最少必要的前置知识我必须掌握,不然效率极慢。掌握最少必要知识之后开始新东西的学习会事半功倍。
  2. 理论和实践相结合。纸上得来终觉浅,欲知此事须躬行。

Mybatis——动态SQL foreach批量操作相关推荐

  1. (4) hibernate增删查改+批量操作+类似Mybatis动态sql

    简介 采用spring + hibernate + freemaker+ maven搭建起来的一个hibernate增删查改和 类似mybatis动态sql查询的一个案例 增删查改demo + 动态s ...

  2. MyBatis动态SQL详解

    一:MyBatis动态 sql 是? 1.动态 SQL 是 MyBatis 的强大特性之一.在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句.根据不同的条件拼接 SQL 语句是 ...

  3. Mybatis动态SQL语句大全

    动态 SQL 语句大全 读完这篇文章里你能收获到 Mybatis动态SQL语句大全 Mybatis中如何定义变量 Mybatis中如何提取公共的SQL片段 1.if语句 需求:根据作者名字和博客名字来 ...

  4. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...

  5. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  6. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...

  7. MyBatis动态SQL,写SQL更爽

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  8. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...

  9. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

最新文章

  1. ValueError: Bin labels must be one fewer than the number of bin edges
  2. Java toString()方法的要点
  3. tomcat启动流程分析
  4. java-通过JDBC操作数据库
  5. 安装centos linux7,安装centos7
  6. 推荐计算机科学类的经典书籍
  7. python文本模糊匹配
  8. 基于RabbitMQ实现的订单超时功能-记录备查
  9. “本是青灯不归客,却因浊酒留风尘,星光不问赶路人,岁月不负有心人”,你是怎么理解的?
  10. win10微软商店/账号登录一直转圈
  11. Ubiquitous Religions(并查集)
  12. 文本对比。文本编辑距离算法
  13. python大气校正_sen2cor批量大气校正Sentinel2数据——python代码
  14. 互联网日报 | 滴滴出租车上线“作弊举报”功能;蚂蚁集团进入上市辅导期;百度App日活达2.04亿...
  15. 关于su和sudo以及vi sudo 的权限讨论
  16. _undo_autotune
  17. 启动计算机时出现grub,win7开机出现grub引导修复教程
  18. dos命令远程重启计算机,远程重启、关闭电脑命令、远程重启及其常用计算机命令...
  19. jquery 与php交互,jquery实现瀑布流并与php实现数据交互
  20. [日常] NOIWC 2018爆零记

热门文章

  1. three.js制作星空
  2. 电影推荐:六部影响你恋爱观的爱情电影,勿错过
  3. 图分析在大数据时代的应用
  4. modelsim打开和生成VCD文件的方法
  5. 键盘输入时只按了一次,却出现好几个字母(Fn+F10关闭加速)
  6. 论文代码细读(初学者入门,两张图看懂塔克融合论文代码)MUTAN: Multimodal Tucker Fusion for Visual Question Answering
  7. Java密钥库及keytool使用详解
  8. 【IPD】企业如何推行IPD
  9. 常见优化主图错误的几种方式,快来看看店铺主图是否存在这些问题?
  10. 将整个项目背景设为黑白色