@[TOC](myBatis-plus/myBatis 流式查詢,大數(shù)據(jù)量查詢)
myBatis這個開源框架的好處就不再贅述,myBatis-plus則更是myBatis的增強工具壶愤,框架給我提供很多查詢數(shù)據(jù)方式,非常方便馏鹤, 這里就介紹一下流式查詢,也就是游標(biāo)的方式去查詢娇哆。
我們在完成工作的途中會遇到大數(shù)據(jù)量的查詢湃累,比如大量數(shù)據(jù)的導(dǎo)出等等,我們直接用list()
方法去查詢的話碍讨, 會很慢很卡治力,因為框架耗費大量的時間和內(nèi)存去把數(shù)據(jù)庫查詢的大量數(shù)據(jù)封裝成我們想要的實體類,在這個過程中很可能使我們的項目報內(nèi)存溢出 OOM(out of memory) 的異常,所以這個時候我們需要用框架的原生數(shù)據(jù)查詢了勃黍,如下:
把整理類都給出來宵统,方便在查找問題,屏蔽了部分本地路徑
- 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
表示游標(biāo)只向前滾動 -
fetchSize
每次獲取量
@ResultType(OrgData.class)
- 轉(zhuǎn)換成返回實體類型
注意: 返回類型必須為void 哦覆获,因為在handler
里處理數(shù)據(jù)马澈,所以這個hander 也是必須的
- mapper調(diào)用使用
orgDataMapper.getOrgWithBigData(queryWrapper,resultContext -> {
OrgData orgData = resultContext.getResultObject();
//這邊循環(huán)調(diào)用就可以實現(xiàn)業(yè)務(wù)了
}
end