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

目录
相关文章
|
1天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在执行SQL查询时遇到报错,代码为[XX000],该怎么解决?
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
7天前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
24 7
|
21天前
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用
|
11天前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
|
13天前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
15天前
|
Java 数据库连接 Maven
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
|
20天前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
20天前
|
SQL Java 数据库连接
MyBatis动态SQL
MyBatis动态SQL
23 0
|
2月前
|
算法 Java 数据库连接
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
|
2月前
|
Java 数据库连接 Spring
Spring 整合mybatis
Spring 整合mybatis
30 2