如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?

MyBatis 批量插入(ExecutorType.BATCH) 一、在mybatis中ExecutorType的使用 1.Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句, 并且批量执行所有更新语句,显然batch性能将更优; 2.但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的; 在测试中使用simple模式提交10000条数据,时间为18248 毫 阅读详情

MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。

以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点:

1. 配置 MyBatis 使用 ExecutorType.BATCH

主要有两种方式可以来配置 MyBatis 使用 BATCH 执行器类型:

a) 在 SqlSessionFactoryBean 中配置 (推荐在 Spring Boot 中使用):

在 Spring Boot 应用中,通常通过 SqlSessionFactoryBean 来配置 SqlSessionFactory。我们可以在 SqlSessionFactoryBean 中设置 defaultExecutorType 属性为 BATCH。

import org.apache.ibatis.session.ExecutorType;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        // 设置默认的 ExecutorType 为 BATCH
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setDefaultExecutorType(ExecutorType.BATCH);
        factoryBean.setConfiguration(configuration);
        // ... 其他配置,例如 Mapper 扫描路径等
        return factoryBean;
    }
}

b) 编程式的方式创建 SqlSession 时指定 ExecutorType.BATCH:

如果需要更细粒度的控制,或者只想在特定的操作中使用批量处理,可以在创建 SqlSession 时指定 ExecutorType.BATCH。

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void batchInsertUsers(List<User> users) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
            UserMapper batchMapper = sqlSession.getMapper(UserMapper.class);
            for (User user : users) {
                batchMapper.insertUser(user); // 执行插入操作
            }
            sqlSession.flushStatements(); // 刷新批处理语句,执行批量操作
            sqlSession.commit(); // 提交事务
        }
    }
}

2. 在 Mapper XML 文件中编写批量操作 SQL

在 Mapper XML 文件中,需要编写能够处理集合参数的 SQL 语句,通常使用 <foreach> 标签来循环遍历集合并构建批量 SQL。

a) 批量 INSERT 示例:

假设有一个 User 实体类,你需要批量插入多个用户。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">

    <insert id="batchInsertUsers" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
        insert into users (username, password, email) values
        <foreach collection="list" item="item" separator=",">
            (#{item.username}, #{item.password}, #{item.email})
        </foreach>
    </insert>

    <insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id">
        insert into users (username, password, email) values (#{username}, #{password}, #{email})
    </insert>

    <!-- ... 其他 Mapper 方法 -->

</mapper>
  • parameterType="java.util.List": 指定方法参数类型为 List。
  • <foreach collection="list" item="item" separator="," >: 循环遍历传入的 List,item 代表当前循环的元素,separator 指定元素之间的分隔符为逗号 ,。
  • (#{item.username}, #{item.password}, #{item.email}): 使用 #{item.propertyName} 获取 User 对象的属性值。
  • useGeneratedKeys="true" keyProperty="id": 如果需要获取自增主键,需要配置 useGeneratedKeys 和 keyProperty。

b) 批量 UPDATE 示例:

批量更新多个用户的邮箱地址。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">

    <update id="batchUpdateUsersEmail" parameterType="java.util.List">
        <foreach collection="list" item="item" separator=";" open="" close=";" index="index">
            update users set email = #{item.email} where id = #{item.id}
        </foreach>
    </update>

    <!-- ... 其他 Mapper 方法 -->

</mapper>
  • <foreach collection="list" item="item" separator=";" open="" close=";" index="index">: 循环遍历 List,separator=";" 使用分号作为分隔符。注意: 这里使用了分号 ; 分隔多个 UPDATE 语句。不同的数据库对批量 UPDATE 的语法支持可能有所不同,有些数据库可能不支持这种方式,或者有其他更高效的批量更新语法。例如 MySQL 可以使用 INSERT ... ON DUPLICATE KEY UPDATE 或 REPLACE INTO 等。

3. Spring Boot Service 层调用批量操作 Mapper 方法

在 Spring Boot Service 层,需要调用 Mapper 接口中定义的批量操作方法,并传入包含数据的 List。务必使用 @Transactional 注解来管理事务,确保批量操作的原子性。

import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void batchInsertUsers(List<User> users) {
        userMapper.batchInsertUsers(users);
    }

    @Transactional
    public void batchUpdateUsersEmail(List<User> users) {
        userMapper.batchUpdateUsersEmail(users);
    }
}

4. 性能优化的关注点

  • 事务管理 (@Transactional): 批量操作必须在事务中进行,以保证操作的原子性。如果批量操作过程中出现错误,可以回滚所有操作,保持数据一致性。Spring Boot 的 @Transactional 注解可以方便地管理事务。

  • 批量大小 (Batch Size): 批量操作并非批量越大越好。过大的批量可能会导致:

    • 数据库压力过大: 单次请求发送大量 SQL 可能导致数据库服务器资源消耗过高。
    • 内存占用过高: 如果批量操作涉及到大量数据,可能会占用大量内存。
    • 事务时间过长: 过长的事务会增加锁冲突的风险,影响并发性能。

    最佳批量大小需要根据实际场景进行测试和调优。一般来说,可以尝试从较小的批量大小开始(例如 100, 500, 1000),逐步增加并监控数据库性能,找到最佳的平衡点。

  • 数据库连接池配置: 确保数据库连接池配置合理,能够支持高并发的批量操作。Spring Boot 默认使用 HikariCP 连接池,性能良好,但仍需根据应用负载调整连接池参数,例如 maximum-pool-size, minimum-idle 等。

  • 网络延迟: 批量操作的主要优势是减少网络 round trips。如果网络延迟较高,批量操作的性能提升会更加明显。

  • 数据库服务器性能: 最终性能也受限于数据库服务器的性能。确保数据库服务器配置合理,性能良好,例如 CPU, 内存, 磁盘 IO 等。

  • 批量操作的适用场景: 批量操作最适合一次性处理大量数据的场景,例如数据导入、数据迁移、批量更新状态等。对于频繁的小批量操作,可能提升效果不明显,甚至可能因为额外的批处理开销而降低性能。

  • Generated Keys 的处理: 如果批量 INSERT 需要获取自增主键,MyBatis 提供了 useGeneratedKeys 和 keyProperty 属性。但需要注意,不同数据库对批量获取自增主键的支持程度可能有所不同。对于 MySQL,批量 INSERT 可以一次性获取所有自增主键。

  • 错误处理: 批量操作中如果某条 SQL 执行失败,需要妥善处理错误。默认情况下,MyBatis 的 ExecutorType.BATCH 在遇到错误时会停止执行后续的 SQL。我们需要根据业务需求,决定是忽略错误继续执行,还是回滚整个批量操作。

总结:

在 Spring Boot 项目中使用 MyBatis 的 ExecutorType.BATCH 进行批量操作,可以显著提升处理大量数据的性能。关键在于正确配置 ExecutorType.BATCH,编写高效的批量 SQL 语句,合理设置批量大小,并结合事务管理和错误处理机制。 性能优化是一个迭代过程,需要根据实际应用场景和性能测试结果进行调整和完善。

Elastic+Spring-batch+Mybatis整合实现 背景 因为有企业级批处理需求,具体到应用场景就是在三方支付系统中,日切后要进行清分结算的跑批处理。所以使用到成熟的spring batch,依托其强大且灵活的批量处理功能,再加上elastic任务调度整合来实现清分结算业务流程。本文章就是分别说明了elastic和spring-batch + mybatis的常规使用和两者的整合,仅供大家参考。。 项目整体结构 就先把elastic和s... 阅读详情

相关推荐

【MyBatis-Plus】之批量插入

一、应用情景介绍 在实际的项目开发过程中,常常遇到批量保存数据的场景,当数据量比较少,比如只有几条数据的情况下,我们可以使用 for 循环来 insert 数据,但如果数据量比较多的情况下就不行,特别是并发的情况下,因为这样会增加数据库的负担。 我们通过查看 mybatis-plus 源码发现,mybatis-plus 的 IService API 接口提供了批量插入的接口: public interface IService<T> { ...... /** * 插入

王廷云的博客 1万+

springboot整合mybatis实现批处理

前提:整合配置请看springboot整合mybatis篇 1.在mapper接口中编写方法(参数为list集合) /** * 批处理存储数据进入表 */ Integer batchInsertTOrderItems(@Param("tOrderItemlist") List<TOrderItem> tOrderItemlist); 2.编写mapper.xml配置文件(注解也可以我这里就不多解释了) <mapper namespace="com.quanzhan.map

qq_1757537040的博客 1067

高效批量插入:Java + Spring Boot + Mybatis 实战指南

本文深入探讨了在Spring Boot + Mybatis环境下实现高效批量数据插入的方法。文章首先分析了批量插入在实际业务中的需求及其性能优势,然后详细介绍了技术实现方案,包括基础环境搭建、Mybatis Mapper配置、服务层设计等核心环节。针对性能优化,文章提出了批量提交限制、合理设置批量大小、事务管理等关键策略,并给出了1000-5000条的最佳批量范围建议。通过这套完整的技术方案,开发者可以有效解决大规模数据处理的性能瓶颈,显著提升系统吞吐量和稳定性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1024

SpringBoot结合MyBatis 【超详细】

Spring Boot与MyBatis框架集合实践。内置MyBatis大部分使用技巧,而Spring Boot起到个快速入门的效果。其中MyBatis内容涉及到业务层与数据访问层的传参知识、企业常用的动态SQL拼接、高级映射及延迟加载、以及缓存机制、最后包括PageHelper分页插件

m0_65563175的博客 12万+

Spring Boot与MyBatis

Spring Boot是一个用于创建独立的、基于Spring的生产级应用程序的框架,它简化了Spring应用的初始搭建以及开发过程。MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。将Spring Boot和MyBatis结合使用,可以高效地开发数据驱动的应用程序。

m0_74823963的博客 978

SpringIOC之BeanFactoryResolver

以下是一个示例,演示如何在 Spring 配置中使用 BeanFactoryResolver:

qq_57756904的博客 718

快马AI一键生成:MyBatis foreach 批量操作实战指南

这时候,MyBatis的foreach标签就派上用场了,它能将List集合中的数据批量拼接到SQL语句中。可以智能生成这类MyBatis代码,只需要简单描述需求就能得到完整的Controller、Service、Mapper实现,连XML配置都自动生成好了。在开发后台管理系统时,经常需要处理批量数据操作。传统的一条条插入效率太低,于是研究了一下MyBatis的foreach标签,发现它真是批量操作的利器。我试了下批量插入功能的生成结果,代码结构清晰,还自带了基础的异常处理,比自己从头写要高效得多。

SunstoneLion34的博客 560

大宗农产品交易知识图谱推理引擎的构建--需求分析

大宗农产品交易知识图谱推理引擎的构建 一、项目概述 ​ 进入信息时代,全球产生的数据量爆炸式增长,一方面数据产生的方式发生改变,由手工产生越来越多地转为自动化生成,另一方面,人类的活动也越来越依赖数据;民以食为天,粮食方面的信息数据对人类来说至关重要,而当前繁杂的数据已经超出了人工处理的范围,这就对数据采集和数据处理提出了新的要求。 知识图谱是将大量收集的数据整理成机器能处理的知识库,并实现可视化的展示。知识图谱本质上是一种大规模的语义网络,其主要目的是对真实世界里的实体或概念之间的关联关系进行描述;构造

qq_40583949的博客 2586

Spring Boot数据访问篇:整合MyBatis操作数据库

本文详细介绍了如何在Spring Boot项目中整合MyBatis进行数据访问操作。内容包括MyBatis基本概念、Spring Boot项目创建、数据库连接配置、实体类设计、Mapper接口实现、Service层和Controller层开发等。通过实际案例演示了完整的开发流程,并介绍了MyBatis的高级特性和最佳实践。

felix 1125

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 316

BK7238(XH-WB3S)固件烧录实战:从AT固件选择到稳定下载全解析

本文详细解析了BK7238(XH-WB3S)模组固件烧录的全过程,从AT固件版本选择到稳定下载的实战技巧。重点介绍了烧录前的准备工作、硬件连接的正确姿势、烧录软件的实战技巧以及疑难问题排查指南,帮助开发者高效完成BK7238模组的固件烧录。

weixin_29159441的博客 248

新人一看就懂:Spring Boot+Spring mvc+Mybatis的基础框架demo

Spring Boot的设计目的是来简化新Spring应用的初始搭建以及开发过程,大大减少了代码量,通过这篇文章你可以清楚的看到。这是一个基于Spring Boot的简单demo,希望读者可以通过这篇文章大概能看懂这一个简单的框架搭建。后续我会陆续更新,微服务架构(Spring Boot、Spring Cloud)、分布式架构(Dobbo+Zookeeper)、大数据架构以及源码解析等相关的文章,感兴趣的话可以关注一下。

程序员云帆哥的博客 2万+

微服务架构的实施与挑战:前提判断、三种落地模式、收益兑现与风险应对

微服务是用运维复杂度换取演进自由度的一笔交易,是否划算取决于系统复杂度是否越过生产率曲线的交叉点。本文先给出实施前提:微服务溢价的六项成本、四项前置能力、康威定律与领域边界,并附就绪度自检表;再拆解三种落地模式:以绞杀者为代表的渐进剥离与数据五级迁移、以模块化单体起步的绿地建设、新旧并行的混合式集成;随后逐项审视六大技术优势与组织收益的兑现条件,系统梳理分布式谬误、分布式单体、Saga与幂等、弹性容错、可观测性、契约测试等挑战与对策,最后给出四阶段落地路线、DORA四项度量与常见反模式清单。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的<foreach>标签和批处理模式(ExecutorType.BATCH)。

BillKu的博客 1877

2026年软考信息安全工程师备考指南

信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格,是信息产业部和人事部在最新的“国人厅发[2007]139号文件中新增的专业。2016年下半年,第一次开考信息安全工程师(中级)考试。 考试科目: 1.信息安全基础知识,考试时间为150分钟,笔试,选择题; ...

鹿鸣天涯 7396

低功耗设计-ir drop的signoff corner怎么选择?

2.tt的(tt85 是比较接近芯片真实工作情况的);我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?有要求就用要求的就好,没要求前两种看公司需求。3.signoff文档要求的;有几个方向,看公司需求吧。

m0_61544122的博客 1590

Spring Boot项目中结合MyBatis详细使用

Spring Boot项目中结合MyBatis使用

4190

单细胞转录组数据分析中的基因ID注释转换问题:如何解决才能注释所有的UMIcount数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1126

Spring Boot整合MyBatis实现简单的CRUD

这篇文章主要针对java初学者,详细介绍如何创建一个基本的springboot项目来对数据库进行crud操作。

沐雨橙风ιε的博客 4487

京东/淘宝商品评论情感分析:基于Python的大规模评论爬取与NLP情感分析实战

在当今电商蓬勃发展的时代,用户评论已成为影响消费者购买决策的关键因素。本文将详细介绍如何使用Python最新技术栈爬取京东和淘宝商品评论,并运用先进的自然语言处理技术对评论进行情感分析,识别用户的好评与差评倾向。通过完整的代码实现和深入的技术解析,帮助读者掌握从数据采集到情感分析的全流程。本文详细介绍了如何使用Python最新技术栈实现京东和淘宝商品评论的爬取与情感分析。通过结合异步爬虫、反爬策略、BERT情感分析等先进技术,我们构建了一个完整的评论分析系统。高效爬取。

2201_76125261的博客 1402

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Boot+MyBatis Plus批量插入实战:性能提升数十倍的完整方案

批量处理(Batch Processing)作为数据处理领域的核心技术,通过将多个操作打包成批次一次性执行,大幅减少网络开销和事务管理成本。其技术原理基于减少数据库连接次数和事务提交频率,在数据迁移、日志入库等场景中价值显著。本文结合Spring Boot和MyBatis Plus框架,深入解析批量插入的三种实现方式,通过实测对比展示如何将万条记录插入性能从12秒优化至0.4秒。方案包含智能批次大小调整、断点续传机制和完整的错误处理流程,特别针对MySQL的rewriteBatchedStatements参

weixin_34265814的博客 488

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MyBatis-Plus在Spring Boot项目中的CRUD操作实践

在Spring Boot项目中使用MyBatis-Plus进行CRUD操作的核心技术点在于合理利用MyBatis-Plus提供的基础Mapper接口和注解,通过分层架构(Controller层、Service层、Mapper层)来实现业务逻辑的分离和数据库操作的封装。这样可以提高代码的可维护性和可扩展性。通过本小节的学习,我们掌握了在Spring Boot项目中使用MyBatis-Plus进行CRUD操作的具体方法,包括创建Controller层、调用Service层方法和调用Mapper接口的方法。

fykam的博客 1796

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Boot+Mybatis项目中实现多主键数据表的批量增加、批量删除操作

Spring Boot + Mybatis项目实现多主键数据表的批量增加、批量删除操作 ​ 方法使用SQL语句中的foreach标签进行批量操作,在Spring Boot + Mybatis项目中只需要修改对应的Mapper.xml文件,将增加一条记录的SQL语句改为批量增加,将删除一条的记录的SQL语句改为批量删除。 SQL语句中foreach标签的使用介绍:   <delete id="...

ziyu_one的博客 3912

Spring Boot项目中使用MyBatis

在Spring Boot项目中使用MyBatis可以极大地简化配置过程,并且Spring Boot提供了很好的集成支持。你只需要添加必要的依赖,配置数据源,然后创建Mapper接口、XML映射文件和实体类,就可以轻松地进行数据库操作了。

weixin_73060959的博客 1658

在 Spring Boot 中使用 MyBatis-Plus 进行批量操作数据

通过 MyBatis-Plus 提供的saveBatch和方法,我们可以非常方便地实现在 Spring Boot 项目中的批量操作数据。这些方法简化了 SQL 的编写,提高了开发效率,同时也遵循了 MyBatis-Plus 的约定大于配置的设计理念。在实际应用中,根据业务需求和数据量,选择合适的批量操作方法可以有效提高系统性能,减少数据库交互次数。希望本文能帮助你更好地利用 MyBatis-Plus 进行批量操作数据的开发。

qq_28068311的博客 1835

Spring Boot整合tk-mybatis、PageHelper

本文介绍了tk-mybatis这一曾经流行的MyBatis增强框架的使用方法,尽管它已被MyBatis-Plus取代,但仍值得了解。文章详细展示了如何从零开始整合tk-mybatis:从数据库准备(创建歌曲表并插入测试数据)、创建Spring Boot项目、添加依赖(包括tk-mybatis和分页插件PageHelper),到配置数据源和MyBatis。重点讲解了实体类创建、Mapper接口定义(继承tk.mybatis.mapper.common.Mapper)以及核心API的使用,包括增删改查操作和基于

沐雨橙风ιε的博客 3560
上一篇: Nacos 服务实例元数据有什么作用?如何使用元数据进行服务管理?
下一篇: Nacos 提供了哪些服务的保护机制?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值