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

批量插入大量数据(例如几十万条)时,如果每条单独插入,会非常慢,内存占用也高。这里总结一种 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 → 一次性插入数据库

好处:

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

  • 控制内存占用

  • 易于维护和调试

相关推荐
Cloud_Shy6187 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
问心无愧051340 分钟前
ctf show web入门110
前端·笔记
道一231 小时前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
lunzi_08262 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
郭庆汝4 小时前
FastAPI使用笔记
笔记·fastapi
爱讲故事的5 小时前
计算机网络第七章:无线与移动网络复习笔记
网络·笔记·计算机网络
小陈phd5 小时前
Text2SQL智能体学习笔记(一)——NL2SQL及执行流程介绍
笔记·学习
问心无愧05135 小时前
ctf sow web入门112
android·前端·笔记
稷下元歌5 小时前
系统学习plc 基础指令上篇,官方资料课程笔记整 理
笔记·学习
我是唐青枫5 小时前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis