(场景题)怎么实现数据的批量插入?

批量插入大量数据(例如几十万条)时,如果每条单独插入,会非常慢,内存占用也高。这里总结一种 CSV → Java 对象 → MyBatis 批量插入 的通用实现方法。


1️⃣ 流程概览

  1. 准备 CSV 文件

    • CSV 文件每行表示一条数据

    • 每列对应对象的一个字段

  2. Java 读取 CSV

    • 使用流式读取方式,逐行解析 CSV

    • 每行生成一个 Java 对象

  3. 收集对象到列表

    • 定义一个 batchList,每次把解析的对象加入列表

    • 当列表长度达到批量大小(如 1000 条)时执行批量插入

  4. 批量插入到数据库

    • 使用 MyBatis <foreach> 或 JDBC 批处理

    • 批量插入完成后,清空列表,继续下一批

  5. 处理剩余数据

    • CSV 读完后,如果 batchList 还有未满的对象,也要插入一次

2️⃣ Java 读取 CSV 示例

使用 OpenCSV 流式读取:

java 复制代码
int batchSize = 1000;
List<MyData> batchList = new ArrayList<>();

try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) {
    String[] row;
    while ((row = reader.readNext()) != null) {
        MyData record = new MyData();
        record.setField1(row[0].trim());
        record.setField2(row[1].trim());
        // ...设置其他字段...

        batchList.add(record);

        if (batchList.size() == batchSize) {
            myMapper.insertBatch(batchList); // MyBatis批量插入
            batchList.clear(); // 清空列表
        }
    }

    if (!batchList.isEmpty()) {
        myMapper.insertBatch(batchList);
    }
} catch (IOException e) {
    e.printStackTrace();
}

✅ 特点:

  • 流式处理:不会一次性占用大量内存

  • 分批控制:每批插入数据库,提升性能


3️⃣ MyBatis 批量插入 SQL 示例

XML 复制代码
<insert id="insertBatch" parameterType="java.util.List">
    INSERT INTO my_table (field1, field2, field3)
    VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.field1}, #{item.field2}, #{item.field3})
    </foreach>
</insert>

解释:

  • parameterType="java.util.List":告诉 MyBatis 参数是一个列表

  • <foreach> 遍历列表,每个元素用 item 访问

  • separator=",":每条记录之间用逗号分隔,生成完整 SQL

注意 :SQL 太长可能会超出数据库限制,所以建议 每批 500~1000 条


4️⃣ 原理解析

  1. MyBatis 将 List 中每个对象的字段替换到 #{item.xxx} 占位符

  2. <foreach> 拼接成一条完整的 INSERT ... VALUES (...),(...),(...) SQL

  3. 数据库一次执行这条 SQL,即可插入多条记录

  4. 相比逐条插入,性能提升显著,因为减少了网络往返和事务提交次数


5️⃣ 优化建议

  • 批次大小:500~1000 条比较稳,太大可能导致 SQL 超长

  • 内存管理:使用流式读取 CSV,不要一次性把所有数据读入内存

  • 事务控制:每批单独提交,方便回滚

  • 大数据量:超过几十万条,建议使用 JDBC 批处理(ExecutorType.BATCH)


6️⃣ 总结

MyBatis 批量插入的核心就是 把 CSV 转成 Java 对象 → 收集成批 → <foreach> 拼 SQL → 一次性插入数据库

好处:

  • 显著减少数据库交互次数

  • 控制内存占用

  • 易于维护和调试

相关推荐
曾经的三心草4 小时前
redis-9-集群
java·redis·mybatis
听麟5 小时前
HarmonyOS 6.0+ PC端虚拟仿真训练系统开发实战:3D引擎集成与交互联动落地
笔记·深度学习·3d·华为·交互·harmonyos
识君啊5 小时前
MyBatis-Plus 逻辑删除导致唯一索引冲突的解决方案
java·spring boot·mybatis·mybatis-plus·唯一索引·逻辑删除
一个人旅程~5 小时前
我存在吗?你存在吗?
笔记·程序人生·电脑·ai写作
xqqxqxxq5 小时前
Java IO 核心:BufferedReader/BufferedWriter & PrintStream/PrintWriter 技术笔记
java·笔记·php
架构师刘伟5 小时前
MyBatis-Dynamic 进阶:无需实体类的全动态数据建模
mybatis
第七序章6 小时前
【Linux学习笔记】初识Linux —— 理解gcc编译器
linux·运维·服务器·开发语言·人工智能·笔记·学习
-Springer-6 小时前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
那我掉的头发算什么6 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
崎岖Qiu6 小时前
【计算机网络 | 第十篇】以太网的 MAC 层
网络·笔记·计算机网络·mac地址