【第14章】MyBatis-Plus批量操作

文章目录

  • 前言
  • 一、功能概览
  • 二、类结构说明
    • 1.MybatisBatch<?>
    • 2.MybatisBatch.Method<?>
    • 3. BatchMethod<?>
    • 4.使用步骤
    • 5.返回值说明
  • 三、使用示例
    • 1. execute方法
    • 2. 示例一:实体类型数据
    • 3. 示例二:非实体类型数据
    • 4. 示例三:自定义方法插入(无注解)
    • 5. 示例四:自定义方法插入(带注解)
  • 四、saveOrUpdate方法
    • 1. 跨sqlSession示例
    • 2. 共用sqlSession示例
  • 五、事务处理示例
    • 1. Spring事务处理示例
  • 总结


前言

批量操作是一种高效处理大量数据的技术,它允许开发者一次性执行多个数据库操作,从而减少与数据库的交互次数,提高数据处理的效率和性能。在MyBatis-Plus中,批量操作主要用于以下几个方面:

  • 数据插入(Insert):批量插入是批量操作中最常见的应用场景之一。通过一次性插入多条记录,可以显著减少SQL语句的执行次数,加快数据写入速度。这在数据迁移、初始化数据等场景中尤为有用。
  • 数据更新(Update):批量更新允许同时修改多条记录的特定字段,适用于需要对大量数据进行统一变更的情况,如批量修改用户状态、更新产品价格等。
  • 数据删除(Delete):批量删除操作可以快速移除数据库中的多条记录,常用于数据清理、用户注销等场景。

添加链接描述


一、功能概览

  • 支持版本:3.5.4 +
  • 事务控制:需手动管理(默认关闭)
  • 执行结果:返回批量处理结果,便于业务判断成功与否
  • 数据写入:取决于代码是否正确执行到flushStatements
  • 兼容性:支持Spring与非Spring项目
  • 异常类型:执行抛出PersistenceException
  • 建议:对于saveOrUpdate方法,建议保持简单的新增或更新操作

二、类结构说明

1.MybatisBatch<?>

  • 泛型:实际数据类型
  • sqlSessionFactory:可通过容器获取,非Spring容器下需自行初始化Mybatis并记录上下文
  • dataList:实际批量数据处理列表(不可为空)

2.MybatisBatch.Method<?>

实际为BatchMethod,简化框架内部操作方法调用。

  • 泛型:实际Mapper方法参数类型
  • mapperClass:具体的Mapper类

3. BatchMethod<?>

  • 泛型:实际Mapper方法参数类型
  • statementId:执行的MappedStatement ID
  • parameterConvert:参数类型转换处理器,用于数据类型与Mapper方法参数不一致时的转换

4.使用步骤

  1. 创建MybatisBatch实例(绑定数据与sqlSessionFactory)
  2. 创建MybatisBatch.Method实例(确定执行的Mapper类方法)
  3. 执行操作(将批量参数转换为Mapper方法所需参数)

5.返回值说明

返回类型:List

返回内容:每次执行MappedStatement + SQL的操作结果分组。

注意:例如批量根据ID更新,若10条数据中5条更新一个字段,5条更新两个字段,则返回值为容量为2的List,分别存储5条记录的更新情况。

三、使用示例

框架提供MybatisBatchUtils进行静态方法调用。

1. execute方法

适用于insert, update, delete操作。

2. 示例一:实体类型数据

List<H2User> userList = Arrays.asList(new H2User(2000L, "测试"), new H2User(2001L, "测试"));
MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, userList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert());

3. 示例二:非实体类型数据

List<Long> ids = Arrays.asList(120000L, 120001L);
MybatisBatch<Long> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, ids);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert(id -> {H2User h2User = new H2User();h2User.setTestId(id);return h2User;
}));

4. 示例三:自定义方法插入(无注解)

// mapper方法定义
@Insert("insert into h2user(name,version) values( #{name}, #{version})")
int myInsertWithoutParam(H2User user1);// 准备数据
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithoutParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithoutParam"));

5. 示例四:自定义方法插入(带注解)

// 带注解的mapper方法定义
@Insert("insert into h2user(name,version) values( #{user1.name}, #{user1.version})")
int myInsertWithParam(@Param("user1") H2User user1);// 准备数据
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithParam", (user) -> {Map<String, Object> map = new HashMap<>();map.put("user1", user);return map;
}));

四、saveOrUpdate方法

执行保存或更新操作。

注意:跨sqlSession下需注意缓存和数据感知问题。

1. 跨sqlSession示例

@Autowired
private H2UserMapper userMapper;List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(40000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> userMapper.selectById(h2User.getTestId()) == null), // 判断条件mapperMethod.updateById()); // 指定update方法

2. 共用sqlSession示例

List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(50000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> sqlSession.selectList(mapperMethod.get("selectById").getStatementId(), h2User.getTestId()).isEmpty()), // 判断条件mapperMethod.updateById()); // 指定update方法

五、事务处理示例

1. Spring事务处理示例

@Autowired
private TransactionTemplate transactionTemplate;transactionTemplate.execute((TransactionCallback<List<BatchResult>>) status -> {MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);// 执行批量插入MybatisBatchUtils.execute(sqlSessionFactory, h2UserList, mapperMethod.insert());throw new RuntimeException("出错了");
});

总结

回到顶部

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

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

相关文章

茗鹤 | 如何借助APS高级计划排程系统提高汽车整车制造的效率

在我们做了详尽的市场调研及头部汽车制造企业排程需求沟通后&#xff0c;我们发现尽管企业有很多的业务系统做支撑&#xff0c;在计划排程领域&#xff0c;所有的汽车制造总装厂仍旧使用人工“Excel”做排产规划&#xff0c;其中少部分也会借助MRP、第三方辅助排产工具。鉴于我…

ChatGPT:Java中的对象引用实现方式

ChatGPT&#xff1a;Java中的对象引用实现方式 如果使用句柄的话&#xff0c;那么 Java 堆中将会划分出一块内存来作为句柄池&#xff0c;reference 中存储的就是对象的句柄地址&#xff0c;而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息。 你提到的句柄机制是…

JVM原理(十一):JVM虚拟机六种必需对类进行初始化的情况

Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这个过程被称作虚拟机的类加载机制。Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态链接这个特…

104.二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

相机参数与图像处理技术解析

01. 相机内参和外参的含义&#xff1f;如果将图像放大两倍&#xff0c;内外参如何变化&#xff1f; 相机有两个最基础的数据&#xff1a;内参(Instrinsics)和外参(Extrinsics)&#xff0c;内参主要描述的是相机的CCD/CMOS感光片尺寸/分辨率以及光学镜头的系数&#xff0c;外参主…

每日两题 / 20. 有效的括号 155. 最小栈(LeetCode热题100)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 遇到左括号入栈 遇到右括号判断栈顶是否为匹配的左括号 最后判断栈是否为空 func isValid(s string) bool {var stk []runefor _, value : range s {if value ( || value { || value [ {stk append(stk, value)}…

阿里巴巴图标库iconfont的使用方式

文章目录 什么是 iconfong创建一个自己的项目如何使用Unicode 使用方法Font class 使用方式Symbol 使用方式还有一种使用方式 在线链接&#xff08;不推荐&#xff0c;但可用于测试&#xff09; 什么是 iconfong Iconfont 是一种图标字体服务。它将各种图标设计转换为字体格式…

数据库的约束与索引

数据库的约束与索引 文章目录 数据库的约束与索引一、约束1、定义2、主键索引3、唯一约束4、非空约束5、外键约束 二、索引1、定义2、主键索引3、唯一索引4、普通索引5、全文索引 三、深入索引面试题&#xff08;一&#xff09;面试题&#xff08;二&#xff09;面试题&#xf…

【设计模式】行为型-状态模式

在变幻的时光中&#xff0c;状态如诗篇般细腻流转。 文章目录 一、可调节的灯光二、状态模式三、状态模式的核心组件四、运用状态模式五、状态模式的应用场景六、小结推荐阅读 一、可调节的灯光 场景假设&#xff1a;我们有一个电灯&#xff0c;它可以被打开和关闭。用户可以…

snap和apt的区别简单了解

Linux中没有tree命令的时候提示安装的时候出现了两个命令&#xff0c;简单看了看两者有何区别&#xff08;一般用apt就可以了&#xff09;&#xff1a; sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的&#xff0c;但它们使用的是不…

在线教育平台,easyexcel使用案例

控制器 因为如何想要在读数据的时候操作数据库&#xff0c;就必须使用构造方法传dao 或者service&#xff0c;因为这个不归spring管理&#xff0c;不能自动注入&#xff0c;所以参数里需要传递service 或者 dao AutowiredIEduSubjectService subjectService;添加课程分类的方法…

Anaconda学习常见问题汇总

问题1&#xff1a;Fatal error in launcher: Unable to create process using ‘“d:\anaconda\isntall\envs\learn1\python.exe 在进行anaconda学习时&#xff0c;在控制台输入&#xff1a;pip list想要查看环境里的内容时发生错误&#xff1a; Fatal error in launcher: Un…

个人博客|PHP源码|支持多国语言切换

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;支持多国语言的个人博客网站源码&#xff0c;支持二开&#xff0c;无加密。此博客相当简洁&#xff0c;也适合海外。详细界面和功能见下面视频演示。 如果您正好有此需求源码&#xff0c;请联系小编…

软件资产管理系统:提升企业软件资产透明度与合规性的终极解决方案!

在当今数字化转型浪潮中&#xff0c;企业软件资产管理的重要性日益凸显。然而&#xff0c;传统的手工管理方式往往效率低下&#xff0c;难以应对快速变化的软件环境。SmartLic软件资产管理系统应运而生&#xff0c;它以先进的技术手段&#xff0c;为企业提供全面的软件资产管理…

开源自动化热键映射工具autohotkey十大用法及精选脚本

AutoHotkey&#xff08;AHK&#xff09;是一款功能强大的热键脚本语言工具&#xff0c;它允许用户通过编写脚本来自动化键盘、鼠标等设备的操作&#xff0c;从而极大地提高工作效率。以下是AutoHotkey的十大经典用法&#xff0c;这些用法不仅解放了用户的双手&#xff0c;还展示…

程序化交易广告及其应用

什么是程序化交易广告&#xff1f; 程序化交易广告是以实时竞价技术即RTB&#xff08;real-time bidding&#xff09;为核心的广告交易方式。说到这里&#xff0c;你可能会有疑问&#xff1a;像百度搜索关键词广告还有百度网盟的广告&#xff0c;不也是CPC实时竞价的吗&#x…

MDX的魔法:探索SQL Server中的多维表达式

&#x1f4ca; MDX的魔法&#xff1a;探索SQL Server中的多维表达式 在商业智能和数据分析领域&#xff0c;SQL Server提供了一种强大的工具来处理多维数据集&#xff0c;这就是多维表达式&#xff08;Multidimensional Expressions&#xff0c;简称MDX&#xff09;。MDX是一种…

论文学习_UVSCAN: Detecting Third-Party Component Usage Violations in IoT Firmware

论文名称发表时间发表期刊期刊等级研究单位 Understanding the Security Risks Introduced by Third-Party Components in IoT Firmware 2024年IEEE TDSCCCF A佐治亚理工学院 1. 引言 研究背景&#xff1a;物联网&#xff08;IoT&#xff09;已经无处不在&#xff0c;为我们…

HQChart报价列表高级应用教程7-走势列数据对接

HQChart报价列表高级应用教程7-走势列数据对接 走势列小程序效果图PC效果图HQChart代码地址走势列类型配置走势列数据格式示例走势列 单独使用一列显示每个股票的走势图 小程序效果图 PC效果图 HQChart代码地址 地址:github.com/jones2000/HQChart 走势列类型 REPORT_COL…

[工业网络] 模型建立

普渡大学ICS参考模型 普渡企业参考架构&#xff08;PERA&#xff09;是由西奥多J威廉姆斯&#xff08;Theodore J. Williams&#xff09;和普渡大学计算机集成制造工业大学联盟的成员在1990年代开发的企业架构参考模型。该模型被ISA-99&#xff08;现为ISA/IEC 62443&#xff…