Mybatis批量更新对象数据的两种方法

说明:遇到一次需要批量修改对象的场景。传递一个对象集合,需要根据对象ID批量修改数据库数据,使用的是MyBatis框架。查了一些资料,总结出两种实现方式。

创建Demo

首先,创建一个简单的Demo;

(User,用户对象)

import lombok.Data;
import java.io.Serializable;@Data
public class User implements Serializable {private String id;private String username;private String password;
}

(UserController,用户控制器)

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserMapper userMapper;/*** 根据ID查询用户* @param id* @return*/@GetMapping("/getUser/{id}")public String getUser(@PathVariable("id") String id){return userMapper.getUser(id).toString();}
}

(UserMapper,用户数据访问接口)

import com.hezy.pojo.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper {User getUser(String id);
}

数据库数据,tb_user

在这里插入图片描述

项目启动,测试一下接口,没得问题;

在这里插入图片描述

批量更新

创建一个新的接口,用于触发批量更新对象的代码,内容是传递一个List集合对象给Mapper处理;

    @GetMapping("/updateUser")public void updateUser(){ArrayList<User> users = new ArrayList<>();User user1 = new User();user1.setId("1");user1.setUsername("zhangsan_fix");User user2 = new User();user2.setId("2");user2.setUsername("lisi_fix");user2.setPassword("654321_fix");users.add(user1);users.add(user2);userMapper.updateUser(users);}

接下来,重点是Mapper.xml中的Statement要怎么写,继续往下看

方式一

首先,我们可以使用动态SQL,如下:

    <update id="updateUser"><foreach collection="users" item="user" separator=";">update tb_user<set><if test="user.username != null and user.username != ''">username = #{user.username},</if><if test="user.password != null and user.password != ''">password = #{user.password}</if></set>where id = #{user.id}</foreach></update>

我们把拼接后的SQL打印出来,会发现一个问题。SQL中,分号(;)表示一条语句的结束,使用上面的方式拼接出来的方式,是多条SQL。

在这里插入图片描述

因此产生了一个问题,Mybatis中一个Statement标签中可以有多条SQL吗? 答案是默认不可以,所以上面的代码报错了。需要在数据库连接后面加上&allowMultiQueries=true配置,如下:

在这里插入图片描述

再次执行,修改成功了,这是第一种方式;

在这里插入图片描述

在这里插入图片描述

查看日志发现,Updates:1,就是说如果需要返回更新的记录条数,那么这种方式返回的更新条数会是1,不能正常体现出数据库发生变化的记录条数;

另外,将多条SQL合成一条执行,有SQL注入的风险

方式二

第二种方式是用一条SQL的方式来实现,如下:

	<update id="updateUser">update tb_usersetusername = case<foreach collection="users" item="user">when id = #{user.id}<choose><when test="user.username != null and user.username != ''">then #{user.username}</when><otherwise>then username</otherwise></choose></foreach>end,password = case<foreach collection="users" item="user">when id = #{user.id}<choose><when test="user.password != null and user.password != ''">then #{user.password}</when><otherwise>then password</otherwise></choose></foreach>endwhere<foreach collection="users" item="user" separator="or">id = #{user.id}</foreach></update>

看着有些复杂,拼接后的SQL如下:

	update tb_usersetusername = casewhen id = '1' then 'zhangsan_fix'when id = '2' then 'lisi_fix'end,password = casewhen id = '1' then passwordwhen id = '2' then '654321_fix'endwhere id = '1'or id = '2';

这种方式不需要加额外的配置,执行测试;

在这里插入图片描述

查看数据库,没得问题,批量修改完成了;

在这里插入图片描述

总结

本文介绍了Mybatis框架下,批量更新对象的两种方法:

  • 方法一:将多条更新语句合成一条执行,需要在数据库链接后面增加配置,不能体现正常的修改记录条数,有SQL注入的风险;

  • 方法二:使用case then 关键字实现,SQL复杂,行数多,降低了可阅读性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Jwt+Redis

大致流程&#xff1a; 参照&#xff1a; 史上最全面的基于JWT token登陆验证_完整的基于jwt的登陆认证-CSDN博客 springboot整合JWTRedis_springboot jwt redis-CSDN博客

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:浮层)

设置组件的遮罩文本。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 overlay overlay(value: string | CustomBuilder, options?: { align?: Alignment; offset?: { x?: number; y?: number } })…

剑指offer面试题28:对称的二叉树

#试题28&#xff1a;对称的二叉树 题目&#xff1a; 请设计一个函数判断一棵二叉树是否 轴对称 。 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。示例 2&#xff1a; 输入&#xff1a;root …

【合宙ESP32C3 Arduino开发】第四篇:TFT_eSPI 驱动 合宙Air101 ST7735 LCD 显示普通时钟,模块化编程

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建时间 2024-03-02❤️❤️ 本篇更新时间 2024-03-02❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64f;…

白话大模型② | 如何提升AI分析的准确性?

白话大模型系列共六篇文章&#xff0c;将通俗易懂的解读大模型相关的专业术语。本文为第二篇&#xff1a;如何提升AI分析的准确性&#xff1f; 作者&#xff1a;星环科技 人工智能产品部 面对AI分析落地时的数量化、准确性、泛化性等问题&#xff0c;让我们稍微深入了解下当前…

pycharm专业版本的安装

一 、到官网下载对应的pycharm安装包 也可以把安装软件&#xff08;用物理机下载到共享文件夹&#xff09; 然后进入Ubuntu系统把下载大的安装包剪贴到目标路径 1 在ubuntu中创建一个用来存放pycharm安装包的文件夹 rootzmq-virtual-machine:/home/zmq/Desktop# mkdir pycha…

京东云硬钢阿里云:承诺再低10%

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%&#xff0c;这热度还没过&#xff0c;京东云当晚就喊话&#xff1a;“随便降、比到底!&#xff0c;全网比价&#xff0c;击穿低价&#xff0c;再低10%”&#xff0c;并…

[技巧]Arcgis之图斑四至范围批量计算

ArcGIS图层&#xff08;点、线、面三类图形&#xff09;四至范围计算 例外一篇介绍&#xff1a;[技巧]Arcgis之图斑四至点批量计算 说明&#xff1a;如下图画出来的框&#xff08;范围标记不是很准&#xff09; &#xff0c;图斑的x最大和x最小&#xff0c;y最大&#xff0c;…

专为大模型训练优化,百度集合通信库 BCCL 万卡集群快速定位故障

1 集合通信对分布式训练至关重要 在分布式训练中&#xff0c;每一块 GPU 只负责处理部分模型或者数据。集群中不同 GPU 之间通过集合通信的方式&#xff0c;完成梯度同步和参数更新等操作&#xff0c;使得所有 GPU 能够作为一个整体加速模型训练。 如果有一块 GPU 在集合通…

1_SQL

文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库&#xff08;NoSQL&#xff09; 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…

性别和年龄的视频实时监测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉&#xff1f; 计算机视觉是使计算机能…

基于Camunda实现bpmn 2.0各种类型的任务

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器&#xff08;建模工具&#xff09;&#xff0c;用来构建我们的流程模型。Camunda Modeler流程绘图工具&#xff0c;支持三种协议类型流程文件分别为&#xff1a;BPMN、DMN、Form。 ​ Camunda Modeler下载…

配置MySQL与登录模块

使用技术 MySQL&#xff0c;Mybatis-plus&#xff0c;spring-security&#xff0c;jwt验证&#xff0c;vue 1. 配置Mysql 1.1 下载 MySQL :: Download MySQL Installer 1.2 安装 其他页面全选默认即可 1.3 配置环境变量 将C:\Program Files\MySQL\MySQL Server 8.0\bin…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

Avalonia学习(二十八)-OpenGL

Avalonia已经继承了opengl&#xff0c;详细的大家可以自己查阅。Avalonia里面启用opengl继承OpenGlControlBase类就可以了。有三个方法。分别是初始化、绘制、释放。 这里把官方源码的例子扒出来给大家看一下。源码在我以前发布的单组件里面。地址在前面的界面总结博文里面。 …

YOLOv9有效改进|使用空间和通道重建卷积SCConv改进RepNCSPELAN4

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 SCConv是一种即插即用的空间和通道重建卷积。 RepNCSPELAN4是YOLOv9中的特征提取模块&#xff0c;类似YOLOv5和v8中的C2f与C3模块。 …

MySQL进阶:MySQL事务、并发事务问题及隔离级别

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习、 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;视图&&存储过程&&存储函数&&触发器 &#x1f4da;订阅专栏&#xff1a;MySQL进…

Docker Machine windows系统下 安装

如果你是 Windows 平台&#xff0c;可以使用 Git BASH&#xff0c;并输入以下命令&#xff1a; basehttps://github.com/docker/machine/releases/download/v0.16.0 &&mkdir -p "$HOME/bin" &&curl -L $base/docker-machine-Windows-x86_64.exe >…

点燃技能火花:探索PyTorch学习网站,开启AI编程之旅!

介绍&#xff1a;PyTorch是一个开源的Python机器学习库&#xff0c;它基于Torch&#xff0c;专为深度学习和科学计算而设计&#xff0c;特别适合于自然语言处理等应用程序。以下是对PyTorch的详细介绍&#xff1a; 历史背景&#xff1a;PyTorch起源于Torch&#xff0c;一个用于…

【真机Bug】异步加载资源未完成访问单例导致资源创建失败

1.错误表现描述 抽卡时&#xff0c;10抽展示界面为A。抽取内容可能是整卡或者碎片&#xff0c;抽到整卡&#xff0c;会有立绘展示和点击详情的按钮。点击详情后出现详情页B。【此时界面A预制体被销毁&#xff0c;卡片数据进入数据缓存池】点击页面B的返回按钮&#xff0c;单例…