MyBatis Plus中的批量插入:通过开启rewriteBatchedStatements=true

MyBatis Plus中的批量插入:通过开启rewriteBatchedStatements=true

MyBatis Plus中的批量插入:通过开启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方法,执行批量插入操作。

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_51447496/article/details/132029499