当前位置: 首页 > news >正文

41. 如何在MyBatis-Plus中实现批量操作?批量插入和更新的最佳实践是什么?

在 MyBatis-Plus 中,实现批量操作(如批量插入、批量更新)是非常常见的需求。MyBatis-Plus 提供了对批量操作的良好支持,可以通过多种方式实现高效的批量处理。下面详细介绍批量操作的实现方式以及最佳实践。

1. 批量插入

批量插入是指一次性插入多条记录,而不是逐条插入。MyBatis-Plus 提供了多种方式来实现批量插入。

1.1 使用 insertBatchSomeColumn 方法

MyBatis-Plus 提供了 insertBatchSomeColumn 方法,可以直接插入一个集合的所有元素。这个方法通常用于插入时可以选择性地忽略一些不需要的字段(如主键自增的场景)。

示例:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
​
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
​public boolean batchInsert(List<User> userList) {return this.saveBatch(userList);}
}

调用示例:

List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 30));
​
userService.batchInsert(userList);
  • saveBatch:MyBatis-Plus 提供的 saveBatch 方法可以一次性插入多个记录。该方法默认使用了批量插入的 SQL 优化,可以在一定程度上减少数据库的连接开销。

1.2 使用 Mapper 接口的批量插入

你也可以通过在 Mapper 接口中自定义批量插入的 SQL 语句来实现批量插入操作。

自定义批量插入 SQL:

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import java.util.List;
​
public interface UserMapper extends BaseMapper<User> {
​@Insert("<script>" +"INSERT INTO user (name, age) VALUES " +"<foreach collection='list' item='user' separator=','>" +"(#{user.name}, #{user.age})" +"</foreach>" +"</script>")int batchInsert(@Param("list") List<User> userList);
}

调用示例:

List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 30));
​
userMapper.batchInsert(userList);
  • <foreach> 标签:在 MyBatis 的 XML 中使用 <foreach> 标签遍历集合,并生成批量插入的 SQL 语句。

2. 批量更新

批量更新指的是一次性更新多条记录。与批量插入类似,MyBatis-Plus 也提供了多种方式实现批量更新。

2.1 使用 updateBatchById 方法

MyBatis-Plus 提供了 updateBatchById 方法,支持根据 ID 批量更新多个实体。

示例:

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
​public boolean batchUpdate(List<User> userList) {return this.updateBatchById(userList);}
}

调用示例:

List<User> userList = new ArrayList<>();
userList.add(new User(1L, "Alice", 26)); // 更新ID为1的用户
userList.add(new User(2L, "Bob", 31)); // 更新ID为2的用户
​
userService.batchUpdate(userList);
  • updateBatchById:该方法会根据传入的实体集合中的 ID,依次更新对应的记录。每个实体只更新有变动的字段。

2.2 自定义批量更新 SQL

你也可以通过在 Mapper 接口中自定义批量更新的 SQL 语句来实现批量更新操作。

自定义批量更新 SQL:

import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Param;
import java.util.List;
​
public interface UserMapper extends BaseMapper<User> {
​@Update("<script>" +"<foreach collection='list' item='user' separator=';'>" +"UPDATE user " +"SET name = #{user.name}, age = #{user.age} " +"WHERE id = #{user.id}" +"</foreach>" +"</script>")int batchUpdate(@Param("list") List<User> userList);
}

调用示例:

List<User> userList = new ArrayList<>();
userList.add(new User(1L, "Alice", 26));
userList.add(new User(2L, "Bob", 31));
​
userMapper.batchUpdate(userList);
  • <foreach> 标签:与批量插入类似,使用 <foreach> 标签遍历集合并生成批量更新的 SQL 语句。

3. 批量操作的最佳实践

  1. 使用批量操作方法:MyBatis-Plus 提供的 saveBatchupdateBatchById 方法已经优化了 SQL 执行的效率,建议优先使用这些方法。

  2. 控制批量操作的大小:在批量插入或更新时,最好控制单次操作的批量大小(例如每次操作 1000 条记录),以避免 SQL 语句过长或数据库连接超时问题。

  3. 考虑使用数据库事务:批量操作通常需要涉及多条 SQL 语句的执行,为了保证操作的原子性,可以考虑在批量操作时使用数据库事务。

  4. 使用乐观锁:如果批量更新操作涉及并发写入,建议使用乐观锁来避免数据冲突,MyBatis-Plus 支持通过 @Version 注解实现乐观锁机制。

  5. 合理配置 MyBatis-Plus 插件:在高并发场景下,合理配置 MyBatis-Plus 的分页、乐观锁、SQL 性能分析等插件,可以提高应用的性能和稳定性。

总结

  • 批量插入:可以通过 MyBatis-Plus 的 saveBatch 方法实现,或者通过自定义 Mapper 接口的批量插入 SQL 语句实现。

  • 批量更新:可以通过 MyBatis-Plus 的 updateBatchById 方法实现,或者通过自定义 Mapper 接口的批量更新 SQL 语句实现。

  • 最佳实践:在批量操作中,合理控制批量大小、使用事务、应用乐观锁,以及配置好插件,可以确保批量操作的高效和稳定。

MyBatis-Plus 为批量操作提供了简便的接口和优化手段,使得开发者可以更加高效地处理大批量数据的插入和更新操作。

相关文章:

41. 如何在MyBatis-Plus中实现批量操作?批量插入和更新的最佳实践是什么?

在 MyBatis-Plus 中&#xff0c;实现批量操作&#xff08;如批量插入、批量更新&#xff09;是非常常见的需求。MyBatis-Plus 提供了对批量操作的良好支持&#xff0c;可以通过多种方式实现高效的批量处理。下面详细介绍批量操作的实现方式以及最佳实践。 1. 批量插入 批量插入…...

LlamaIndex 的Node节点后处理器模块介绍

Node 后处理器模块 LlamaIndex 是一个旨在连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的框架&#xff0c;允许开发者构建能够处理和回应复杂查询的应用程序。在这个框架内&#xff0c;NodePostProcessor 扮演着优化数据处理流程的重要角色。为了更好地理解 NodeP…...

Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解

Dubbo 是一个高性能的 Java 分布式服务框架&#xff0c;而 Zookeeper 常被用作 Dubbo 的服务注册中心。Zookeeper 提供了分布式一致性和协调服务&#xff0c;Dubbo 通过 Zookeeper 实现服务注册与发现功能&#xff0c;确保在分布式环境下服务实例的动态管理和可靠发现。 下面是…...

Linux:进程间通信之命名管道

Linux&#xff1a;进程间通信-CSDN博客 我们说匿名管道只能用于父子进程这样的关系通信&#xff0c;那么陌生进程怎么通信&#xff1f; 我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct&#xff0c;从而通过文件的inode映射同一份文件来通…...

UE4_后期处理七—仿红外线成像效果

效果图展示&#xff1a; 参考文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-fresnel-in-your-unreal-engine-materials?application_version5.4 二、所用知识点扩充 在创建电影或过场动画时&#xff0c;你常常需要想办法更好地突显角…...

静态路由和默认路由(实验)

目录 一、实验设备和环境 1、实验设备 2、实验环境 &#xff08;1&#xff09;实验拓扑图 &#xff08;2&#xff09;实验命令列表 二、实验记录 1、直连路由与路由表查看 步骤1:建立物理连接并运行超级终端。 步骤2:在路由器上查看路由表。 2、静态路由配置 步骤1:配…...

TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model

文章汇总 存在的问题 原文&#xff1a;具有图像特定知识的图像条件提示符号在提升类嵌入分布方面的能力较差。 个人理解&#xff1a;单纯把"a photo of {class}"这种提示模版作为输入是不利于text encoder学习的 动机 在可学习的提示和每一类的文本知识之间建立…...

2024年软考网络工程师中级题库

1【考生回忆版】以下不属于5G网络优点的是&#xff08;A) A.传输过程中消耗的资源少&#xff0c;对设备的电池更友好 B.支持大规模物联网&#xff0c;能够连接大量低功耗设备&#xff0c;提供更高效的管理 C.引入了网络切片技术&#xff0c;允许将物理网络划分为多个虚拟网络…...

CSS的盒子模型(Box Model)

所有HTML元素都可以看作盒子&#xff0c;在CSS中盒子模型是用来设计和布局的&#xff0c;CSS盒子模型本质上是一个盒子&#xff0c;分装周围的HTML元素包括&#xff1a;外边距&#xff0c;边框&#xff0c;内边距和实际内容。 Margin&#xff08;外边距&#xff09; 清除边框…...

用OpenSSL搭建PKI证书体系

1 创建PKI结构目录 mkdir 07_PKI cd 07_PKI mkdir 01_RootCA 02_SubCA 03_Client2 创建根CA cd 01_RootCA mkdir key csr cert newcerts touch index.txt index.txt.attr echo 01 > serial2.1 创建根CA密钥对 2.1.1 生成 长度为2048 bit 的RSA私钥。 cd key openssl gen…...

scp 命令:在两台主机间远程传输文件

一、命令简介 ​scp​ 命令使用 SSH ​加密的方式在本地主机和远程主机之间复制文件。 ‍ 二、命令参数 格式 scp [选项] 发送方主机和目录 接收方主机和目录注意&#xff1a;左边是发送方&#xff0c;右边是接收方。固定格式。 示例 #示例1 scp ~/test.txt soulio172.1…...

家用迷你洗衣机哪款质量高?五大热销高分单品强势来袭

迷你内衣洗衣机一般是为婴儿宝宝&#xff0c;或者一些有特殊需要的用户而设计使用的&#xff0c;宝宝衣物换洗频繁&#xff0c;而且对卫生方面的除菌要求高&#xff0c;而为避免交叉感染&#xff0c;所以一般不适合和大人的衣物放在一起洗&#xff0c;因此对于有宝宝的家庭来说…...

rpm 命令:RedHat底层包管理器

一、命令简介 ​rpm​ 是 Red Hat Package Manager 的缩写&#xff0c;是 Red Hat、CentOS、Fedora 等基于 Red Hat 的 Linux 发行版中用于管理和安装软件包的工具。它能够安装、卸载、升级、查询和验证软件包。 相关命令&#xff1a; rpm 是基础&#xff0c;提供了底层的软…...

Xilinx 使用DDS实现本振混频上下变频

文章目录 一、什么是混频&#xff1f;二、为什么要进行混频&#xff1f;三、Matlab实现混频操作四、FPGA实现混频上下变频操作4.1 例化IP4.2 仿真验证 一、什么是混频&#xff1f; 混频&#xff08;Mixing&#xff09;是信号处理中的一个核心概念&#xff0c;混频的本质是将两个…...

ClickHouse-Kafka Engine 正确的使用方式

Kafka 是大数据领域非常流行的一款分布式消息中间件&#xff0c;是实时计算中必不可少的一环&#xff0c;同时一款 OLAP 系统能否对接 Kafka 也算是考量是否具备流批一体的衡量指标之一。ClickHouse 的 Kafka 表引擎能够直接与 Kafka 系统对接&#xff0c;进而订阅 Kafka 中的 …...

PTA L1-071 前世档案

L1-071 前世档案&#xff08;20分&#xff09; 网络世界中时常会遇到这类滑稽的算命小程序&#xff0c;实现原理很简单&#xff0c;随便设计几个问题&#xff0c;根据玩家对每个问题的回答选择一条判断树中的路径&#xff08;如下图所示&#xff09;&#xff0c;结论就是路径终…...

解决mac下 Android Studio gradle 下载很慢,如何手动配置

抓住人生中的一分一秒&#xff0c;胜过虚度中的一月一年! 小做个动图开篇引题 前言 平时我们clone git 上项目&#xff0c;项目对应gradle版本本地没有&#xff0c;ide编译会自动下载&#xff0c;但是超级慢可能还下载失败&#xff0c;下面讲解下此问题如 如下图所示&#xff…...

第三篇 第17章 工程计量与支付

第三篇 工程计价 第17章 工程计量与支付 17.1 工程计量 17.1.1 工程计量的原则 承包人完成合同工程且应予计量的工程数量确定计量周期可以月为单位,也可以按其他时间节点、工程形象进度分段计量因承包人原因造成的超出合同工程范围施工或返工的工程量、发包人不予计量 17.1…...

[半导体检测-1]:半导体检测概述

前言&#xff1a; 半导体检测是半导体产业链中不可或缺的一环&#xff0c;它贯穿于产品生产制造流程的始终&#xff0c;对于提高产线良率、提升产品竞争实力具有关键作用。以下是对半导体检测的详细概述&#xff1a; 一、什么是半导体检测 半导体检测是指运用专业技术手段&a…...

公共字段自动填充

问题分析 总会有些公共字段&#xff0c;例如创建时间和创建人 实现思路 对mapper定义注解&#xff0c;使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/ public enum OperationType {/*…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...