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

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

时间:2024-09-18 21:24:16浏览次数:3  
标签:批量 插入 41 userList Plus SQL MyBatis

在 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,userList,Plus,SQL,MyBatis
From: https://blog.csdn.net/zhzjn/article/details/142343847

相关文章

  • 如何配置Element-Plus主题颜色
    1.配色方案:主色:表现出网站的整体色系辅助色:除了主色外的其他场景其他色:文本色;标题色;边框色;背景色可在https://www.peisebiao.com/网站中挑选2.安装scss在Node.js项目中安装Sass预处理器的命令。npmisass-D  完整:npminstallsass-D【1】npmisass-D中的i......
  • 精读《C Primer Plus》——作用域(scope)
    作用域(scope)参考:CPrimerPlus第6版第12章存储类别、链接和内存管理1.分类2.blockscope/块作用域2.1.定义block/块是用一块花括号括起来的代码区域块作用域变量的范围是从定义处到包含该定义块的末尾声明在内层块中的变量,其作用域仅局限于该声明所在的块......
  • HighlightPlus插件介绍
    仅对官方文档进行了翻译注意:官方文档本身就落后实际,但对入门仍很有帮助,核心并没有较大改变,有的功能有差异,以实际为准.(目前我已校正了大部分差异,后续我会继续维护该文档)为什么为该插件做翻译?功能强大,使用简单,且还在维护.基于此版本的内置渲染管线文档快速开......
  • 京东商品价格批量获取秘籍:神奇的 API 工具
     在电商的广阔天地中,京东犹如一座璀璨的宝库,无数商品等待着被探索。而商品价格,作为消费者购物决策的关键因素之一,一直备受关注。当我们踏上“探秘京东商品价格秘籍:批量获取的API通道”之旅时,仿佛成为了勇敢的探险家,准备开启一场充满惊喜与发现的征程。   京东的商......
  • P4185 [USACO18JAN] MooTube G 题解
    水一篇题解。也是一道并查集的好题,涉及另一个并查集的基本应用,并查集维护连通块(我跟并查集过不去了???)大致题意:给你一棵树,对于每次询问求一个点所在连通块中到达该点的最小路径权值大于给定值的点个数。既然都连通块了,那我们在维护连通块的时候直接不把权值大于K的边加进去,用并查......
  • word 文档签章控件生成的签章批量删除
    某个签章工具的word插件缺少批量插入签章的功能。同时,发现在投标工具中可以使用导出生成pdf时批量签章的功能。现在需要移除先前手动操作生成的多个签章,有如下发现——1.对少量签章,可以先选中签章右键选择编辑,然后再次选中选择撤销。2.取消com加载项的DSealObjForOffice条目......
  • linux shell批量主机远程执行命令脚本
    基于expect命令实现1.安装expect[root@logstash~]#yuminstall-yexpectLoadedplugins:fastestmirrorLoadingmirrorspeedsfromcachedhostfile*base:mirrors.aliyun.com*extras:mirrors.aliyun.com*updates:mirrors.aliyun.comPackageexpect-5.45-14.el7_......
  • linux shell批量创建用户并设置密码脚本
    useradd.sh#!/bin/bashuser_file=/root/user.txtforuserin$(cat$user_file)doif!id$user&>/dev/null;thenpass=$(echo$RANDOM|md5sum|cut-c1-8)useradd$userecho$pass|passwd--stdin$user&>/dev/nullecho"$u......
  • Kafka生产者如何实现消息的批量发送?
    ApacheKafka生产者可以实现消息的批量发送,这有助于提高数据传输的效率并减少网络负载。在Kafka中,生产者可以配置几个参数来控制批量发送的行为:batch.size:这个参数指定了生产者批次的大小(以字节为单位)。当生产者收集到一定数量的消息(达到指定的字节数),它会将这些消息......
  • 谷歌收录批量查询,怎么批量查询谷歌收录
    批量查询谷歌收录是网站运营和SEO优化中的重要环节,可以帮助网站管理员全面了解网站在谷歌搜索引擎中的表现。以下是一些常用的批量查询谷歌收录的方法和工具:一、使用搜索引擎的site指令虽然site指令本身不支持直接批量查询多个网站的收录情况,但你可以通过编写脚本或利用自动化......