经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
Mybatis动态SQL?foreach批量操作方法
来源:jb51  时间:2023/3/22 9:23:06  对本文有异议

动态SQL Foreach批量操作

前言

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

前置必要知识

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

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

MySQL批量插入

  1. 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 )
  2. VALUES
  3. (
  4. 301906655392563202,
  5. 301906577433034752,
  6. '语文课',
  7. '2022-07-12 19:13:44',
  8. 'EmE6TKu4okhu3qK5M1AGQ4',
  9. '张三',
  10. '2022-07-12 19:13:44',
  11. 'PWeDZyRPADjsdxCNWnSWxZ',
  12. '王五',
  13. 0
  14. ),(
  15. 301906655392563203,
  16. 301906577433034752,
  17. '数学课',
  18. '2022-07-12 19:13:44',
  19. 'EmE6TKu4okhu3qK5M1AGQ4',
  20. '张三',
  21. '2022-07-12 19:13:44',
  22. 'PWeDZyRPADjsdxCNWnSWxZ',
  23. '王五',
  24. 0
  25. )

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

MySQL批量查询

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

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

执行结果

MySQL批量修改

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

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

MySQL批量删除

  1. 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不抛出异常

批量插入

  1. <!--批量插入-->
  2. <insert id="insertBatch">
  3. INSERT INTO tar_course_content_info (
  4. id,
  5. course_assembly_id,
  6. assembly_content,
  7. create_time,
  8. created_id,
  9. created_by,
  10. update_time,
  11. updated_id,
  12. updated_by,
  13. is_delete
  14. ) values
  15. <foreach collection="list" item="item" separator="," >
  16. ( #{item.id},
  17. #{item.courseAssemblyId},
  18. #{item.assemblyContent},
  19. #{item.createTime},
  20. #{item.createdId},
  21. #{item.createdBy},
  22. #{item.updateTime},
  23. #{item.updatedId},
  24. #{item.updatedBy},
  25. #{item.iselete}
  26. )
  27. </foreach>
  28.  
  29. </insert>

执行结果

批量查询

  1. <!--根据创建人和课程组件id进行批量查询 -->
  2. <select id="queryAllCourseContentByCreatedByAndCourseAssemblyId" resultMap="courseContentMap">
  3. SELECT *
  4. FROM tar_course_content_info
  5. WhERE
  6. is_delete=0
  7. and
  8. (created_by, course_assembly_id)
  9. in
  10. <foreach collection="list" item="item" open="(" close=")" separator="," nullable="false">
  11. (#{item.createdBy},#{item.courseAssemblyId})
  12. </foreach>
  13.  
  14. </select>

执行结果

批量修改

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

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

执行结果

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

  1. <!-- 根据课程组件id批量修改创建人姓名-->
  2. <update id="updateAllCreatedByByCourseAssemblyId" >
  3. <foreach collection="list" item="item" separator=";" >
  4. UPDATE tar_course_content_info
  5. SET
  6. created_by = #{item.createdBy}
  7. WHERE
  8. course_assembly_id = #{item.courseAssemblyId}
  9. </foreach>
  10.  
  11. </update>

执行结果

批量删除

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

执行结果

总结

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

到此这篇关于Mybatis动态SQL foreach批量操作的文章就介绍到这了,更多相关Mybatis动态SQL foreach内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号