文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mybatis——动态SQL foreach批量操作

2023-09-04 13:22

关注

动态SQL 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>

执行结果
在这里插入图片描述

批量查询

    <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>

执行结果
在这里插入图片描述

批量修改

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

    <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语句后携带分号,实现多语句执行。
在这里插入图片描述

    <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>

执行结果
在这里插入图片描述

批量删除

    <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. 理论和实践相结合。纸上得来终觉浅,欲知此事须躬行。

来源地址:https://blog.csdn.net/wangwei021933/article/details/129632911

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯