温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Mybatis动态SQL foreach批量操作方法有哪些

发布时间:2023-03-21 11:26:20 来源:亿速云 阅读:187 作者:iii 栏目:开发技术

本篇内容主要讲解“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行

    Mybatis动态SQL foreach批量操作方法有哪些

    MySQL批量查询

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

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

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

    MySQL批量修改

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

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

    Mybatis动态SQL foreach批量操作方法有哪些

    MySQL批量删除

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

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

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

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

    批量查询

    <!--根据创建人和课程组件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>

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

    批量修改

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

    <!--    根据创建人和内容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>

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

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

    Mybatis动态SQL foreach批量操作方法有哪些

    <!--    根据课程组件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>

    执行结果

    Mybatis动态SQL foreach批量操作方法有哪些

    批量删除

    <!--    根据创建人和内容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批量操作方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI