MyBatis 批量插入数据的 3 种方法!(4)

简介: MyBatis 批量插入数据的 3 种方法!(4)

MP 性能测试


import com.example.demo.model.User;
import com.example.demo.service.impl.UserServiceImpl;
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
class UserControllerTest {
    // 最大循环次数
    private static final int MAXCOUNT = 100000;
    @Autowired
    private UserServiceImpl userService;
    /**
     * MP 批量插入
     */
    @Test
    void saveBatch() {
        long stime = System.currentTimeMillis(); // 统计开始时间
        List<User> list = new ArrayList<>();
        for (int i = 0; i < MAXCOUNT; i++) {
            User user = new User();
            user.setName("test:" + i);
            user.setPassword("123456");
            list.add(user);
        }
        // MP 批量插入
        userService.saveBatch(list);
        long etime = System.currentTimeMillis(); // 统计结束时间
        System.out.println("执行时间:" + (etime - stime));
    }
}


以上程序的执行总共花费了 6088 毫秒,如下图所示:


微信图片_20220120230431.jpg


从上述结果可知,使用 MP 的批量插入功能(插入数据 10W 条),它的性能比循环单次插入的性能提升了 14.5 倍。


MP 源码分析


从 MP 和循环单次插入的执行时间我们可以看出,使用 MP 并不是像有些朋友认为的那样,还是循环单次执行的,为了更清楚的说明此问题,我们查看了 MP 的源码。

MP 的核心实现代码是 saveBatch 方法,此方法的源码如下:


微信图片_20220120230446.jpg


我们继续跟进 saveBatch 的重载方法:


微信图片_20220120230507.jpg


从上述源码可以看出,MP 是将要执行的数据分成 N 份,每份 1000 条,每满 1000 条就会执行一次批量插入,所以它的性能要比循环单次插入的性能高很多。


那为什么要分批执行,而不是一次执行?别着急,当我们看了第 3 种实现方法之后我们就明白了。

相关文章
|
4月前
|
Java 数据库连接 mybatis
mybatis 批量插入
mybatis 批量插入
26 0
|
7月前
|
SQL XML Java
Mybatis的多表查询操作 2
Mybatis的多表查询操作
52 1
|
7月前
|
XML Java 数据库连接
Mybatis的多表查询操作 1
Mybatis的多表查询操作
43 1
|
11月前
|
SQL Java 数据库连接
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 上
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 上
|
11月前
|
SQL 缓存 JavaScript
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 下
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 下
|
SQL Java 数据库连接
Mybatis练习(多条件查询)
Mybatis,多条件查询
221 0
Mybatis练习(多条件查询)
|
XML Java 数据库连接
MyBatis注解开发-获取刚插入数据的主键
MyBatis注解开发-获取刚插入数据的主键
166 0
|
SQL Java 数据库连接
MyBatis - 批量插入
MyBatis - 批量插入
445 0
MyBatis - 批量插入
|
SQL Java 数据库连接
mybatis-批量插入与更新
mybatis-批量插入与更新
|
SQL XML Java
MyBatis 三种批量插入方式的对比
先说结论:少量插入请使用反复插入单条数据,方便。数量较多请使用批处理方式。(可以考虑以有需求的插入数据量20条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要)。无论何时都不用xml拼接sql的方式 。