MybatisPlus中的流式查询怎么使用
本篇内容主要讲解“MybatisPlus中的流式查询怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MybatisPlus中的流式查询怎么使用”吧!
Mybatis Plus流式查询
mybatis plus 中自定义如下接口,就可以实现流式查询,mybatis 中同样适用。
@Select("select*fromt_xxxt${ew.customSqlSegment}")@Options(resultSetType=ResultSetType.FORWARD_ONLY,fetchSize=1000)@ResultType(ClearReconDiffAbnormalDO.class)voidlistByStream(@Param(Constants.WRAPPER)Wrapper<Model>wrapper,ResultHandler<Model>resultHandler);
通用流式查询
编写流式查询的方法:
publicclassFetchByStreamextendsAbstractMethod{privatestaticfinalStringMETHOD="fetchByStream";@OverridepublicMappedStatementinjectMappedStatement(Class<?>mapperClass,Class<?>modelClass,TableInfotableInfo){StringsqlFormat="<script>\nSELECT%sFROM%s%s%s\n</script>";Stringsql=String.format(sqlFormat,sqlSelectColumns(tableInfo,true),tableInfo.getTableName(),sqlWhereEntityWrapper(true,tableInfo),sqment());SqlSourcesqlSource=languageDriver.createSqlSource(configuration,sql,modelClass);StringstatementName=mapperClass.getName()+DOT+METHOD;if(configuration.hasStatement(statementName,false)){logger.warn(LEFT_SQ_BRACKET+statementName+"]HasbeenloadedbyXMLorSqlProviderorMybatis'sAnnotation,soignoringthisinjectionfor["+getClass()+RIGHT_SQ_BRACKET);returnnull;}/*缓存逻辑处理*/returnbuilderAssistant.addMappedStatement(METHOD,sqlSource,StatementType.PREPARED,SqmandType.SELECT,Integer.MIN_VALUE,null,null,null,null,modelClass,ResultSetType.FORWARD_ONLY,true,true,false,null,null,null,configuration.getDatabaseId(),languageDriver,null);}}
然后再注入通用方法,在Mapper 写入下方的 method 即可使用。
voidfetchByStream(@Param(Constants.WRAPPER)Wrapper<T>wrapper,ResultHandler<T>handler);
Mybatis Plus大数据量流式查询
一、在需要使用流式查询的mapper文件中,定义流式查询方法
package .unionpay.dao.db2;import .baomidou.mybatisplus.core.mapper.BaseMapper;import .unionpay.entity.TblMallOrder;importorg.apache.ibatis.annotations.*;importorg.apache.ibatis.mapping.ResultSetType;importorg.apache.ibatis.session.ResultHandler;/***(TblMallOrder)表数据库访问层**@authorliudong*@since2023-09-1517:07:13*/@MapperpublicinterfaceTblMallOrderDaoextendsBaseMapper<TblMallOrder>{@Select("${sql}")@Options(resultSetType=ResultSetType.FORWARD_ONLY,fetchSize=1000)@ResultType(TblMallOrder.class)voiddynamicSelectLargeData1(@Param("sql")Stringsql,ResultHandler<TblMallOrder>handler);@Select("${sql}")@Options(resultSetType=ResultSetType.FORWARD_ONLY,fetchSize=1000)@ResultType(Map.class)voiddynamicSelectLargeData2(@Param("sql")Stringsql,ResultHandler<Map>handler);}
二、使用示例
@RestControllerpublicclassTestSearchLargeData{//这是每批处理的大小privatefinalstaticintBATCH_SIZE=1000;privateintsize;//存储每批数据的临时容器privateList<TblMallOrder>mallOrders;@AutowiredprivateTblMallOrderDaotblMallOrderDao;@GetMapping("/getLargeData1")publicvoidgetLargeData1(){Stringsql="select*fromt_mall_order";tblMallOrderDao.dynamicSelectLargeData1(sql,newResultHandler<TblMallOrder>(){@OverridepublicvoidhandleResult(ResultContext<?extendsTblMallOrder>resultContext){TblMallOrdertblMallOrder=resultContext.getResultObject();System.out.println(tblMallOrder);}});}@GetMapping("/getLargeData2")publicvoidgetLargeData2(){Stringsql="select*fromt_mall_order";tblMallOrderDao.dynamicSelectLargeData1(sql,newResultHandler<TblMallOrder>(){@OverridepublicvoidhandleResult(ResultContext<?extendsTblMallOrder>resultContext){TblMallOrdertblMallOrder=resultContext.getResultObject();System.out.println(tblMallOrder);//你可以看自己的项目需要分批进行处理或者单个处理,这里以分批处理为例mallOrders.add(tblMallOrder);size++;if(size==BATCH_SIZE){handle();}}});//用来完成最后一批数据处理handle();}/***数据处理*/privatevoidhandle(){try{//在这里可以对你获取到的批量结果数据进行需要的业务处理}catch(Exceptione){e.printStackTrace();}finally{//处理完每批数据后后将临时清空size=0;mallOrders.clear();}}}
到此,相信大家对“MybatisPlus中的流式查询怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是主机评测网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
上一篇:GoLang之标准库encoding/json包怎么使用
输入法切换键是哪个键?输入法切
冬月是哪一个月?冬月是什么意思
个人所得税退税金额怎么算出来的
输入法全角和半角有什么区别?输
a4纸尺寸是多少厘米?a4纸的由来
个人所得税扣除标准?个人所得税
输入法哪个好用?输入法介绍
卡拉OK是哪个国家发明的?卡拉OK
mikutools原神网页版入口链接?m
关机特别慢什么原因?电脑和手机