2022年8月15日
MyBatis 流式读取大量MySQL数据
原文:https://mp.weixin.qq.com/s/3wZDhmM21wBAXWKmNZZUKA
JDBC三种读取方式:
1、 一次全部(默认):一次获取全部;
2、 流式:多次获取,一次一行;
3、 游标:多次获取,一次多行;
mybatis默认采取第一种。
实现步骤:
这里采用的 controller、service、dao分层开发
- 在service层调用dao接口是,增加一个回调参数 ResultHandler
<>
。 - 对应的dao接口返回值为void
- mapper 填写 parameterType、resultMap、 resultSetType=“FORWARD_ONLY”、 fetchSize=”-2147483648″
为什么dao返回值为void还要在mapper写resultMap?因为回调要用你的resultMap处理,但是不应该返回给service,因为回调处理好了
service层(重点)
public List<Bo> selectForwardOnly(Vo vo, Order order) {
final List<Bo> list = new ArrayList<>();
mapper.selectForwardOnly(vo, order, new ResultHandler<Bo>() {
@Override
public void handleResult(ResultContext<? extends Bo> resultContext) {
/**回调处理逻辑 */
list.add(resultContext.getResultObject());
}
});
return list;
}
dao层:(重点)
/**
* 流式读取数据
* @param vo 查询对象
* @param order 排序
* @param ossVipCustomerBoResultHandler 回调处理
*/
void selectForwardOnly(@Param("record") Vo vo, @Param("order") Order order,
ResultHandler<Bo> handler);
mapper:(重点)

回头有需求可以尝试下,主要是处理降低服务压力,减少gc