
1. 引言在实际业务开发中,数据导出是高频需求。但当数据量达到几十万甚至上百万条时,传统的selectList一次性加载全部数据到内存,往往会导致内存溢出(OOM),甚至拖垮整个应用。MyBatis-Plus 提供了ResultHandler机制,配合流式查询,可以在遍历结果集的同时逐批处理数据,从而以极低的内存占用完成大数据量导出。本文将深入讲解ResultHandler的原理、用法,并给出可直接落地的批量导出实战代码。适用读者本文适合以下读者阅读:使用 MyBatis / MyBatis-Plus 进行数据访问的 Java 后端开发工程师;正在处理大数据量导出(如报表、对账、备份)并遇到内存溢出问题的开发者;希望了解ResultHandler流式查询原理,并想直接落地到生产项目的同学。前置知识阅读本文前,建议你具备以下基础:熟悉 Java 基础语法和 Spring Boot 基本用法;了解 MyBatis-Plus 的基本 CRUD 操作(如BaseMapper、Wrapper条件构造器);了解 JDBC 连接与事务的基本概念。目录概览章节内容2. 为什么大数据量导出会内存溢出分析传统查询方式的内存问题3. ResultHandler 核心原理讲解接口定义与ResultContext关键点4. MyBatis-Plus 中使用 ResultHandlerMapper、XML、Service 三层完整用法5. 大数据集批量导出实战分批收集 + CSV / Excel 批量导出完整代码6. 流式查询的注意事项流式配置、事务与连接占用等要点7. 性能对比与优化建议三种方案对比与调优方向8. 常见问题排查典型报错的原因与解决方案9. 总结核心要点回顾2. 为什么大数据量导出会内存溢出2.1 传统查询方式的问题// 一次性加载全部数据到内存ListUseruserList=userMapper.selectList(null);当userList达到 50 万条时,每条记录按 200 字节估算,仅对象本身就需要约 100MB 内存,再加上 MyBatis 内部的结果集映射、List 扩容等开销,内存占用会成倍增长。2.2 内存占用分析数据量估算内存占用风险1 万条约 2~5 MB低10 万条约 20~50 MB中50 万条约 100~250 MB高100 万条约 200~500 MB极高,极易 OOM注意:以上仅为粗略估算,实际占用取决于字段数量和类型。3. ResultHandler 核心原理3.1 什么是 ResultHandlerResultHandler是 MyBatis 提供的一个结果集处理接口,它允许我们在 MyBatis 遍历数据库结果集的过程中,逐行(或逐批)回调自定义逻辑,而不是等所有结果都映射完成后再统一返回。publicinterfaceResultHandlerT{voidhandleResult(ResultContext?extendsTresultContext);}3.2 与普通查询的对比普通查询 selectList一次性加载全部结果映射为 List 对象内存占用高,易 OOMResultHandler 流式查询逐行读取结果集