Mybatis动态SQL foreach批量操作方法有哪些
本篇内容主要讲解“Mybatis动态SQL foreach批量操作方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mybatis动态SQL foreach批量操作方法有哪些”吧!
动态SQL 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_info WhERE is_delete=0 and (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_info SET created_by = #{item.createdBy} WHERE course_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>
执行结果
到此,相信大家对“Mybatis动态SQL foreach批量操作方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341