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

批量插入大量数据(例如几十万条)时,如果每条单独插入,会非常慢,内存占用也高。这里总结一种 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 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
starlaky4 天前
Django入门笔记
笔记·django
勇气要爆发4 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
勇气要爆发4 天前
吴恩达《LangChain LLM 应用开发精读笔记》2-Models, Prompts and Parsers 模型、提示和解析器
android·笔记·langchain
qianshanxue114 天前
计算机操作的一些笔记标题
笔记
土拨鼠烧电路4 天前
笔记11:数据中台:不是数据仓库,是业务能力复用的引擎
数据仓库·笔记
土拨鼠烧电路4 天前
笔记14:集成与架构:连接孤岛,构建敏捷响应能力
笔记·架构
烟花落o4 天前
栈和队列的知识点及代码
开发语言·数据结构·笔记·栈和队列·编程学习