myBatis-plus/myBatis 流式查询,解决大数据量查询慢而且内存溢出的异常

myBatis-plus/myBatis 流式查询,大数据量查询


myBatis这个开源框架的好处就不再赘述, myBatis-plus则更是myBatis的增强工具,框架给我提供很多查询数据方式,非常方便, 这里就介绍一下流式查询,也就是游标的方式去查询。

我们在完成工作的途中会遇到大数据量的查询,比如大量数据的导出等等,我们直接用list() 方法去查询的话, 会很慢很卡,因为框架耗费大量的时间和内存去把数据库查询的大量数据封装成我们想要的实体类,在这个过程中很可能使我们的项目报内存溢出 OOM(out of memory) 的异常,所以这个时候我们需要用框架的原生数据查询了,如下:

把整理类都给出来,方便在查找问题,屏蔽了部分本地路径

  1. mapper
package com.***.mapper;

import com.***.OrgData;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.ResultSetType;
import org.apache.ibatis.session.ResultHandler;

/**

 * @Author sugar
 */
@Mapper
public interface OrgDataMapper extends BaseMapper<OrgData> {


    @Select("select * from org_data t ${ew.customSqlSegment}")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
    @ResultType(OrgData.class)
    void getOrgWithBigData(@Param(Constants.WRAPPER) QueryWrapper<OrgData> wrapper, ResultHandler<OrgData> handler);



}

注释:

@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
  • ResultSetType.FORWARD_ONLY 表示游标只向前滚动
  • fetchSize 每次获取量
 @ResultType(OrgData.class)
  1. 转换成返回实体类型

注意: 返回类型必须为void 哦,因为在handler里处理数据,所以这个hander 也是必须的

  1. mapper调用使用

        orgDataMapper.getOrgWithBigData(queryWrapper,resultContext -> {

            OrgData orgData = resultContext.getResultObject();
           //这边循环调用就可以实现业务了
}

end

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值