MyBatisPlus中批量插入之如何通过开启rewriteBatchedStatements=true

 更新时间:2025年03月17日 08:38:01   作者:极客李华  
这篇文章主要介绍了MyBatisPlus中批量插入之如何通过开启rewriteBatchedStatements=true问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MyBatis Plus通过开启rewriteBatchedStatements=true

通过开启rewriteBatchedStatements=true的优点

在MyBatis Plus框架中,批量插入是一种高效的数据库操作方式。

通过开启rewriteBatchedStatements=true,可以获得许多优点,从而提高数据库插入性能、减轻负载以及简化代码。

1. 提高性能

传统的一条记录一次插入方式会导致频繁的与数据库服务器的交互,增加了网络开销和处理延迟。

相比之下,通过批量插入将多个数据记录组合成一个批处理语句进行插入,减少了与数据库服务器的交互次数,显著提高了性能。

2. 减轻负载

每条SQL语句在数据库服务器上都需要进行解析、验证和执行等操作,这些操作会占用系统资源并且耗费时间。

通过批量插入,将多条INSERT语句合并为一条语句执行,减少了对数据库的负载,提高了整体的系统响应速度。

3. 事务支持

MyBatis Plus中的批量插入默认会开启事务管理。

在批量插入过程中,如果遇到插入错误,整个批量插入操作会回滚,确保数据的一致性,使用务支持是非常重要的,它可以有效地防止数据插入过程中出现意外情况导致数据不一致或丢失。

4. 简化代码

使用传统的逐条插入方式,需要手动编写循环语句来遍历数据集合,并逐个执行插入操作。而通过批量插入,可以直接将整个数据集合传递给数据库驱动程序进行处理,减少了编码复杂度和工作量。这样简化的代码逻辑使得开发更加高效。

综上所述,通过开启rewriteBatchedStatements=true使用MyBatis Plus中的批量插入功能带来了诸多优点。它不仅提高了数据库操作性能、减轻了负载,也支持事务管理,并且简化了代码逻辑。这种功能在处理大量数据插入的场景中非常有价值和实用。

实现方法

在使用MyBatis Plus的项目中,我们需要在配置文件中进行相应的配置来开启rewriteBatchedStatements=true

下面是一个示例的配置示例:

# application.properties 或者 application.yml(根据你的配置文件类型)
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatements=true
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

在上述配置中,spring.datasource.url选项设置了数据库连接的URL,并通过rewriteBatchedStatements=true开启了MySQL驱动程序的批量处理功能。

这个示例假定你正在使用Spring Boot并将相关的配置信息存储在application.properties或者application.yml文件中。根据你的具体项目和方式,你可能需要在不同的配置文件中添加这个配置,或者使用其他方式来设置。

请确保将spring.datasource.url中的mydatabase替换为你实际的数据库名,并在spring.datasource.usernamespring.datasource.password中提供正确的数据库用户名和密码。

通过在配置文件中设置rewriteBatchedStatements=true,就可以在MyBatis Plus中启用批量插入的功能,并获得其带来的优点。这样,在执行批量插入操作时,MyBatis Plus会自动将多条INSERT语句合并为一条语句执行,提高数据库插入的性能和效率。

请注意,具体的配置方式可能因项目环境而异,请根据你的实际情况进行相应的配置。

代码演示

当使用MyBatis Plus实现批量插入时,需要在Mapper层定义批量插入的方法,在Service层调用该方法,并在ServiceImpl层进行具体的业务逻辑处理。

下面是一个完整的示例代码:

Mapper层

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper extends BaseMapper<User> {
    
    void batchInsert(@Param("list") List<User> userList);
}

在上述代码中,我们定义了一个UserMapper接口,继承自BaseMapper。

在该接口中,添加了一个batchInsert方法,参数为List<User>类型的userList。

Service层

import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

public interface UserService extends IService<User> {

    void batchInsertUsers(List<User> userList);
}

在上述代码中,我们定义了一个UserService接口,继承自IService。

在该接口中,添加了batchInsertUsers方法,参数为List<User>类型的userList。

ServiceImpl层

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public void batchInsertUsers(List<User> userList) {
        baseMapper.batchInsert(userList);
    }
}

在上述代码中,我们创建了一个UserServiceImpl类,该类继承了ServiceImpl,同时实现了UserService接口。在batchInsertUsers方法中,我们调用了baseMapper的batchInsert方法来执行批量插入操作。

在此示例中,使用了@Transactional注解来开启事务,并通过rollbackFor = Exception.class设置了异常回滚策略,确保批量插入操作具有事务支持。请注意,在ServiceImpl层中,我们注入了UserMapper接口,可以通过baseMapper来访问对应的数据库操作。

测试方法

当需要测试插入大量数据的性能时,你可以添加一个测试方法来插入十万条数据并计算执行时间。

下面是一个示例的测试方法:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
public class UserBatchInsertTest {
    
    @Autowired
    private UserService userService;

    @Test
    public void testBatchInsertPerformance() {
        // 创建一万条用户数据
        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            User user = new User();
            // 设置用户属性
            user.setName("User" + i);
            // 添加到用户列表
            userList.add(user);
        }

        long startTime = System.currentTimeMillis();

        // 执行批量插入操作
        userService.batchInsertUsers(userList);

        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        System.out.println("插入十万条数据耗时:" + executionTime + "ms");
    }
}

在上述代码中,我们创建了一个UserBatchInsertTest测试类,并注入UserService接口用于进行批量插入操作。

testBatchInsertPerformance测试方法中,我们首先创建了一万条用户数据,在循环中设置了用户属性,并将其添加到用户列表中。然后记录开始时间。

接着调用userService.batchInsertUsers方法,执行批量插入操作。

最后,记录结束时间,计算执行时间,并将结果打印出来。

通过运行此测试方法,你可以测试插入十万条数据的性能,并获得插入操作所花费的时间。这样可以测试批量插入功能的效率和性能。

请注意,在运行大量数据插入测试时,可能会对数据库和系统带来一定的负载,请根据具体情况进行调整和优化。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java8 Instant 时间戳实例讲解

    Java8 Instant 时间戳实例讲解

    Instant类是Java8 中补充的一个 时间戳类,nstant 可以使用静态方法 now()或者of()方法来创建一个实例对象,本文通过实例代码讲解Java8 Instant 时间戳,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • Java中this关键字用法梳理详细讲解

    Java中this关键字用法梳理详细讲解

    this关键字是java常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,下面这篇文章主要介绍了Java中this关键字用法梳理的相关资料,需要的朋友可以参考下
    2025-07-07
  • 详解spring boot整合JMS(ActiveMQ实现)

    详解spring boot整合JMS(ActiveMQ实现)

    本篇文章主要介绍了详解spring boot整合JMS(ActiveMQ实现),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • SpringBoot Import及自定义装配实现方法解析

    SpringBoot Import及自定义装配实现方法解析

    这篇文章主要介绍了SpringBoot Import及自定义装配实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java多线程中ThreadLocal解读

    Java多线程中ThreadLocal解读

    这篇文章主要介绍了Java多线程中ThreadLocal解读,  多线程访问同一个共享变量的时候容易出现并发问题,因此为了保证线程安全性,我们都会采用加锁的方式,而ThreadLocal是除加锁方式之外的另一种保证线程安全性的方法,需要的朋友可以参考下
    2023-09-09
  • Java语言实现简单FTP软件 FTP协议分析(1)

    Java语言实现简单FTP软件 FTP协议分析(1)

    这篇文章主要介绍了Java语言实现简单FTP软件的第一篇,针对FTP协议进行分析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • IDEA中配置Tomcat全过程

    IDEA中配置Tomcat全过程

    文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本或配置文件以确保生效
    2025-08-08
  • Java中反射机制的使用详解

    Java中反射机制的使用详解

    这篇文章主要介绍了Java中反射机制的使用详解,Java的发射机制允许程序在运行时检查和操作任意一个类、方法、属性等的信息,包括了类名、方法名、属性名、参数列表以及访问修饰符等,需要的朋友可以参考下
    2023-09-09
  • Mybatis返回值(resultType&resultMap)的具体使用

    Mybatis返回值(resultType&resultMap)的具体使用

    返回值属性有两种设置,一种是resultType,一种是resultMap,本文主要介绍了Mybatis返回值(resultType&resultMap)的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • MyBatis update标签详解

    MyBatis update标签详解

    这篇文章主要介绍了MyBatis update标签,使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式,需要的朋友可以参考下
    2023-10-10

最新评论