Mybatis动态SQL foreach批量操作方法

 更新时间:2023年03月20日 17:06:59   作者:王卫——David  
这篇文章主要介绍了Mybatis动态SQL foreach批量操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

执行结果

批量查询

<!--根据创建人和课程组件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批量操作的文章就介绍到这了,更多相关Mybatis动态SQL foreach内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java面向对象基础知识之抽象类和接口

    Java面向对象基础知识之抽象类和接口

    这篇文章主要介绍了Java面向对象的抽象类和接口,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-11-11
  • springboot无法跳转页面的问题解决方案

    springboot无法跳转页面的问题解决方案

    这篇文章主要介绍了springboot无法跳转页面的问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java abstract class 与 interface对比

    Java abstract class 与 interface对比

    这篇文章主要介绍了 Java abstract class 与 interface对比的相关资料,需要的朋友可以参考下
    2016-12-12
  • java高并发下解决AtomicLong性能瓶颈方案LongAdder

    java高并发下解决AtomicLong性能瓶颈方案LongAdder

    这篇文章主要为大家介绍了java高并发下解决AtomicLong性能瓶颈方案LongAdder,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java版简单的猜数字游戏实例代码

    java版简单的猜数字游戏实例代码

    猜数字游戏是一款经典的游戏,该游戏说简单也很简单,说不简单确实也很难,那么下面这篇文章主要给大家介绍了java版简单的猜数字游戏的相关资料,文中给出了详细的实现分析和示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-05-05
  • SpringBoot整合jasypt加密配置文件敏感信息

    SpringBoot整合jasypt加密配置文件敏感信息

    在项目中我们需要对配置文件的一些敏感信息进行加密处理,比如数据库账户密码,避免直接暴露出来,这种场景常常用于生产环境,我们不想让开发人员知道生产库的密码,有运维人员统一管理,所以本文给大家介绍了SpringBoot整合jasypt加密配置文件敏感信息
    2024-06-06
  • JDK9为何要将String的底层实现由char[]改成了byte[]

    JDK9为何要将String的底层实现由char[]改成了byte[]

    String 类的源码已经由 char[] 优化为了 byte[] 来存储字符串内容,为什么要这样做呢?本文就详细的介绍一下,感兴趣的可以了解一下
    2022-03-03
  • Java+MySql图片数据保存与读取的具体实例

    Java+MySql图片数据保存与读取的具体实例

    之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧
    2013-06-06
  • 一文带你弄懂Maven拉包(拉取依赖包)原理

    一文带你弄懂Maven拉包(拉取依赖包)原理

    业务需求开发的时候,我们总是会遇到拉不到依赖包的情况,此时如果不清楚 Maven 拉取依赖包的原理,那么很可能找不到问题所在,今天小编就带大家了解下 Maven 拉包的原理,让你在遇到问题的时候能快速解决,需要的朋友可以参考下
    2023-07-07
  • SpringBoot HttpMessageConverter消息转换器的使用详解

    SpringBoot HttpMessageConverter消息转换器的使用详解

    在整个数据流转过程中,前端的请求报文转化为Java对象,Java对象转化为响应报文,这里就用到了消息转换器HttpMessageConverter
    2022-06-06

最新评论