Mybaits流式查询

本文介绍了在处理大量数据时,如何使用Mybatis的流式查询功能来避免内存溢出,通过定义Mapper、XML配置fetchSize和在Service中使用ResultHandler实现分批获取数据的过程。
摘要由CSDN通过智能技术生成

背景描述

最近在做一个项目,需要把大批量(100列,100w+行)的数据导到Excel中,在查数据时直接OOM。想过用分页查询或者流式查询来解决该问题,考虑到分页查询的效率问题,决定先用流式查询来处理看看效果。在此记录一下流式查询的使用过程。


前言

流式查询:指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用。


mybatis使用步骤

1.定义Mapper

void findList(Map<String,String> params, ResultHandler<CalcRstDtl> handler);

params: 查询参数;
ResultHandler: 回调接口,也就是从游标中获得一条数据就会回调接口中的方法。

2.mapper.xml文件配置

<selsect id="findList" parameterType="java.util.Map" resultMap = "com.cnlab.entity.CalcRstDtl" fetchSize="1000">
	SELECT
		ID, NUM 
	FROM
		T_D_CALC_RST_DTL
	<where>
		<if test="dealerName != null and dealerName != ''">
			AND DEALER_NAME like CONCAT('%',CONCAT(#{dealerName},'%'))
		</if>
	</where>
</select>

fetchSize:select语句需要增加fetchSize属性,底层是调用jdbc的setFetchSize方法,查询时从结果集里面每次取设置的行数,循环去取,直到取完。默认size是0,也就是默认会一次性把结果集的数据全部取出来,当结果集数据量很大时就容易造成内存溢出。


3. service 中调用 Mapper定义的方法

其他业务代码就不展示,直接展示在server中的使用

@Override
 public void calcRstExport(Map<String,String> params){
 	//流式查询调用
	calcRstMapper.findList(params, resultContext ->{
		//获取返回的第几条数据
		int resultCount = resultContext.getResultCount(); 
		//获取当前数据信息
		CalcRstDtl dtl = (CalcRstDtl)resultContext.getResultObject();
		// ****其他业务信息就不过多的展示****
	});
}

总结

查询效率还不错,至少还不会OOM了。
以上就是本次使用 mybatis 流式查询的历程,新手小白第一次上路,还有很多不足之处还请大佬们多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无题白水

一分关爱,无限可能。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值