MyBatis SQL 批量更新(代码➕案例)

简介: MyBatis SQL 批量更新(代码➕案例)

1.场景

当我们在做更新或者是插入操作时,数据为多对多、一一对应的情况

例如:

编号。  名字。  状态
1  tom    0
2  jerry   0
3  jeck   1

代码中循环写入、更新这是大多数人做法,但是肯定不是最优解

2.MyBatis XML

  • 先直接上个终极版

这里数据库中存储了下划线式,代码中用驼峰式。

这里是通过userId修改userStatus。当user_id为1时、user_status为0,当user_id为3时、user_status为1。

    <update id="updateBatch">
    
        update
        <include refid="tableName"/>
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="user_status =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.userId!=null">
                        when user_id=#{i.userId} then #{i.userStatus}
                    </if>
                </foreach>
            </trim>
        </trim>
        where user_id in
        <foreach collection="list" item="i" index="index" open="(" separator="," close=")">
            #{i.userId}
        </foreach>

    </update>

<trim 属性说明

  1. prefix,suffix 表示在 trim 标签包裹的部分的前面或者后面添加内容

如果同时有 prefixOverrides,suffixOverrides 表示会用 prefix,suffix 覆盖 Overrides 中的内容。

如果只有 prefixOverrides,suffixOverrides 表示删除开头的或结尾的 xxxOverides 指定的内容。

2.1.打印sql

==>  Preparing: update `table_test_01` set user_status =case when user_id=? then ? when user_id=? then ? end where user_id in ( ? , ? )
==> Parameters: 1(Long), 10(Integer), 2(Long), 20(Integer), 1(Long), 2(Long)
<==    Updates: 2

2.2.数据库结构

SQL结构体:

CREATE TABLE `table_test_01`
(
    `id`          int(11) NOT NULL AUTO_INCREMENT,
    `name`        varchar(20) NOT NULL,
    `status`      tinyint(4) NOT NULL DEFAULT '0',
    `test_column` varchar(32) NOT NULL DEFAULT '' COMMENT '测试字段',
    `user_id`     bigint(20) NOT NULL DEFAULT '0' COMMENT '测试字段id',
    `user_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '测试字段status',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
INSERT INTO `table_test_01`
VALUES (1, 'tom', 0, '', 1, 10),
       (2, 'jetty', 0, '', 2, 20),
       (3, 'dog', 0, '', 3, 1),
       (4, 'cat', 0, '', 4, 1);

3.实例二

  • 多个字段更新,那就增加 <item

使用 case when 语法。

 UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title = CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)


这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。

    <update id="updateBatch1" parameterType="list">

        update course
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="name=case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.name!=null">
                        when id=#{item.id} then #{item.name}
                    </if>
                </foreach>
            </trim>
            <trim prefix="title =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.title!=null">
                        when id=#{item.id} then #{item.title}
                    </if>
                </foreach>
            </trim>
        </trim>
        where
        <foreach collection="list" separator="or" item="item" index="index">
            id=#{item.id}
        </foreach>
    </update>

4.重点

但是大家要注意一点,这种情况如果出错,我们并不知道是哪条错误,如果使用事务,就会全部回滚,好的办法就是一次批量一部分,分担出错概率。

我是JavaPub,我们下期见。

源码案例下载:https://download.csdn.net/download/qq_40374604/19765415

参考:

https://blog.csdn.net/lu1024188315/article/details/78758943

https://blog.csdn.net/xyjawq1/article/details/74129316

目录
相关文章
|
6天前
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
36 5
mybatis-plus配置sql拦截器实现完整sql打印
|
8天前
|
SQL 前端开发 Java
我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
Mybatis Hibernate 等都是我们常用的 ORM, 它们有时候很好用,但某些场景下也很繁琐,比如下文要讲的一个需求,最后本文会给出比直接用这些 ORM 开发效率至少提高 100 倍的方法...
17 1
我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
|
1天前
|
SQL Java 数据库连接
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
7 0
|
4天前
|
SQL Java 数据库连接
JavaWeb基础第三章(MyBatis的应用,基础操作与动态SQL)
JavaWeb基础第三章(MyBatis的应用,基础操作与动态SQL)
|
8天前
|
SQL 关系型数据库 PostgreSQL
【sql】PostgreSQL物化视图表使用案例
【sql】PostgreSQL物化视图表使用案例
11 0
|
4天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
12天前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
241 1
|
1月前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
161 1
|
6天前
|
SQL 存储 关系型数据库
关系型数据库中的SQL Server
【6月更文挑战第11天】
43 3
|
4天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程