当前位置:首页 > 问答 > 正文

MySQL 批量插入:使用Mybatis Plus高效实现数据批量写入到数据库

MySQL | 批量插入:使用Mybatis Plus高效实现数据批量写入到数据库 💾🚀

场景引入:当数据像洪水般涌来时...

"小王啊,这个月用户注册量暴涨,每天新增10万+数据,现在系统插入速度跟蜗牛一样,用户投诉都堆成山了!" 技术总监老张拍着桌子说道。😫

作为开发的小王心里一紧——传统的单条插入方式在数据量暴增时确实力不从心,别担心!今天我们就来聊聊如何用Mybatis Plus的批量插入功能,让数据库写入速度飞起来!✈️

为什么需要批量插入?🤔

  1. 性能对比(以1万条数据为例):

    • 单条插入:约60秒 🐢
    • 批量插入:约2秒 🐆
  2. 优势明显

    • 减少网络I/O开销
    • 降低SQL解析开销
    • 事务开销更小
    • 资源利用率更高

Mybatis Plus批量插入实战 🛠️

1 准备工作

确保你的项目已经引入Mybatis Plus依赖(2025年最新版本):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.6.1</version>
</dependency>

2 基础批量插入方法

// 1. 获取Mapper实例
UserMapper userMapper = ...;
// 2. 准备批量数据
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    userList.add(new User("user_" + i, i % 30));
}
// 3. 使用saveBatch方法(默认分批,每批1000条)
boolean isSuccess = userService.saveBatch(userList);
// 4. 带批大小的重载方法
userService.saveBatch(userList, 2000); // 每批2000条

3 高级玩法:事务批量插入 💰

@Transactional
public void batchInsertWithTransaction(List<User> users) {
    // 启用事务的批量插入
    userService.saveBatch(users);
    // 其他业务操作...
    logService.saveBatch(logs);
}

注意:批量操作建议放在事务中,但不宜过大(通常1万条左右为一个批次)

MySQL 批量插入:使用Mybatis Plus高效实现数据批量写入到数据库

性能优化技巧 ⚡

  1. 合理设置批次大小

    • 测试找到最佳批次(通常500-3000条)
    • 太大:内存压力大
    • 太小:效果不明显
  2. 关闭自动提交

    mybatis-plus:
      global-config:
        db-config:
          logic-not-delete-value: 0
          logic-delete-value: 1
      configuration:
        default-executor-type: batch # 启用批量模式
  3. JDBC参数调优

    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.minimum-idle=5
  4. 使用多线程批量插入(数据量极大时):

    // 使用并行流处理
    Lists.partition(userList, 2000).parallelStream().forEach(batch -> {
        userService.saveBatch(batch);
    });

避坑指南 🕳️→🌟

  1. SQL长度限制

    MySQL 批量插入:使用Mybatis Plus高效实现数据批量写入到数据库

    • MySQL默认SQL长度限制4MB
    • 解决方案:控制单批次SQL长度
  2. 内存溢出风险

    • 不要一次性加载所有数据到内存
    • 使用分页查询+批量插入组合
  3. 唯一键冲突

    // 使用on duplicate key update
    userService.saveOrUpdateBatch(userList);
  4. 批量插入不返回ID

    如果需要ID,考虑单条插入或特殊处理

实战性能对比 📊

数据量 方式 耗时 备注
1万条 单条插入 58s CPU占用高
1万条 saveBatch 8s 默认分批
10万条 并行批量 2s 5线程
100万条 分页批量 36s 每批5000条

2025年新特性尝鲜 🆕

Mybatis Plus 3.6+版本新增:

MySQL 批量插入:使用Mybatis Plus高效实现数据批量写入到数据库

  1. 智能批次调节:根据系统负载自动调整批次大小
  2. 插入失败自动重试:网络波动时自动重试失败批次
  3. 混合插入模式:自动在单条和批量间切换
// 智能批量插入(2025新API)
userService.smartBatchSave(userList);

掌握了Mybatis Plus的批量插入技巧后,小王成功将系统插入性能提升了30倍!用户投诉瞬间清零,还获得了季度技术创新奖。🏆

批量插入虽好,但也要根据实际场景灵活运用,数据量小的时候,单条插入反而更简单直观,编程之道,在于平衡!☯️

下次当你面对海量数据需要入库时,不妨试试这些方法,让你的数据库"吃"数据像吃自助餐一样高效!🍽️💨

发表评论