Mybatis Plus中的流式查詢案例
Mybatis Plus流式查詢
mybatis plus 中自定義如下接口,就可以實(shí)現(xiàn)流式查詢,mybatis 中同樣適用。
@Select("select * from t_xxx t ${ew.customSqlSegment}") @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000) @ResultType(ClearReconDiffAbnormalDO.class) void listByStream(@Param(Constants.WRAPPER) Wrapper<Model> wrapper, ResultHandler<Model> resultHandler);
通用流式查詢
編寫流式查詢的方法:
public class FetchByStream extends AbstractMethod { ? ? private static final String METHOD = "fetchByStream"; ? ? @Override ? ? public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { ? ? ? ? String sqlFormat = "<script>\nSELECT %s FROM %s %s %s\n</script>"; ? ? ? ? String sql = String.format(sqlFormat, sqlSelectColumns(tableInfo, true), ? ? ? ? ? ? ? ? tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), ? ? ? ? ? ? ? ? sqlComment()); ? ? ? ? SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); ? ? ? ? String statementName = mapperClass.getName() + DOT + METHOD; ? ? ? ? if (configuration.hasStatement(statementName, false)) { ? ? ? ? ? ? logger.warn(LEFT_SQ_BRACKET + statementName + "] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [" + getClass() + RIGHT_SQ_BRACKET); ? ? ? ? ? ? return null; ? ? ? ? } ? ? ? ? /* 緩存邏輯處理 */ ? ? ? ? return builderAssistant.addMappedStatement(METHOD, sqlSource, StatementType.PREPARED, SqlCommandType.SELECT, ? ? ? ? ? ? ? ? Integer.MIN_VALUE, null, null, null, null, modelClass, ? ? ? ? ? ? ? ? ResultSetType.FORWARD_ONLY, true, true, false, null, null, null, ? ? ? ? ? ? ? ? configuration.getDatabaseId(), languageDriver, null); ? ? } }
然后再注入通用方法,在Mapper 寫入下方的 method 即可使用。
void fetchByStream(@Param(Constants.WRAPPER) Wrapper<T> wrapper, ResultHandler<T> handler);
Mybatis Plus大數(shù)據(jù)量流式查詢
一、在需要使用流式查詢的mapper文件中,定義流式查詢方法
package com.unionpay.dao.db2; ? import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.unionpay.entity.TblMallOrder; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.ResultSetType; import org.apache.ibatis.session.ResultHandler; ? /** ?* (TblMallOrder)表數(shù)據(jù)庫訪問層 ?* ?* @author liudong ?* @since 2020-09-15 17:07:13 ?*/ @Mapper public interface TblMallOrderDao extends BaseMapper<TblMallOrder> { ? ? @Select("${sql}") ? ? @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000) ? ? @ResultType(TblMallOrder.class) ? ? void dynamicSelectLargeData1(@Param("sql") String sql, ResultHandler<TblMallOrder> handler); ? ? ? @Select("${sql}") ? ? @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000) ? ? @ResultType(Map.class) ? ? void dynamicSelectLargeData2(@Param("sql") String sql, ResultHandler<Map> handler); }
二、使用示例
@RestController public class TestSearchLargeData { ? ? // 這是每批處理的大小 ? ? private final static int BATCH_SIZE = 1000; ? ? private int size; ? ? // 存儲每批數(shù)據(jù)的臨時(shí)容器 ? ? private List<TblMallOrder> mallOrders; ? ? ? @Autowired ? ? private TblMallOrderDao tblMallOrderDao; ? ? ? @GetMapping("/getLargeData1") ? ? public void getLargeData1() { ? ? ? ? String sql = "select * from t_mall_order"; ? ? ? ? tblMallOrderDao.dynamicSelectLargeData1(sql, new ResultHandler<TblMallOrder>() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void handleResult(ResultContext<? extends TblMallOrder> resultContext) { ? ? ? ? ? ? ? ? TblMallOrder tblMallOrder = resultContext.getResultObject(); ? ? ? ? ? ? ? ? System.out.println(tblMallOrder); ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? ? @GetMapping("/getLargeData2") ? ? public void getLargeData2() { ? ? ? ? String sql = "select * from t_mall_order"; ? ? ? ? tblMallOrderDao.dynamicSelectLargeData1(sql, new ResultHandler<TblMallOrder>() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void handleResult(ResultContext<? extends TblMallOrder> resultContext) { ? ? ? ? ? ? ? ? TblMallOrder tblMallOrder = resultContext.getResultObject(); ? ? ? ? ? ? ? ? System.out.println(tblMallOrder); ? ? ? ? ? ? ? ? // 你可以看自己的項(xiàng)目需要分批進(jìn)行處理或者單個(gè)處理,這里以分批處理為例 ? ? ? ? ? ? ? ? mallOrders.add(tblMallOrder); ? ? ? ? ? ? ? ? size++; ? ? ? ? ? ? ? ? if (size == BATCH_SIZE) { ? ? ? ? ? ? ? ? ? ? handle(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //用來完成最后一批數(shù)據(jù)處理 ? ? ? ? handle(); ? ? } ? ? /** ? ? ?* 數(shù)據(jù)處理 ? ? ?*/ ? ? private void handle(){ ? ? ? ? try{ ? ? ? ? ? ? // 在這里可以對你獲取到的批量結(jié)果數(shù)據(jù)進(jìn)行需要的業(yè)務(wù)處理 ? ? ? ? }catch (Exception e){ ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? }finally { ? ? ? ? ? ? // 處理完每批數(shù)據(jù)后后將臨時(shí)清空 ? ? ? ? ? ? size = 0; ? ? ? ? ? ? mallOrders.clear(); ? ? ? ? } ? ? } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis報(bào)Type interface *.*Mapper is not&
本文主要介紹了Mybatis報(bào)Type interface *.*Mapper is not known to the MapperRegis,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07SpringBoot普通類獲取spring容器中bean的操作
這篇文章主要介紹了SpringBoot普通類獲取spring容器中bean的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SpringBoot啟動時(shí)自動執(zhí)行代碼的幾種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于SpringBoot啟動時(shí)自動執(zhí)行代碼的幾種實(shí)現(xiàn)方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02java構(gòu)建Stream流的多種方式總結(jié)
Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對大家有所幫助2023-11-11一文總結(jié) Shiro 實(shí)戰(zhàn)教程
shiro是apache的一個(gè)開源框架,是一個(gè)權(quán)限管理的框架,實(shí)現(xiàn) 用戶認(rèn)證、用戶授權(quán),這篇文章詳細(xì)總結(jié)了shiro用法,感興趣的同學(xué)可以參考閱讀2023-04-04spring 聲明式事務(wù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了spring 聲明式事務(wù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10java調(diào)用webservice的.asmx接口的使用步驟
這篇文章主要介紹了java調(diào)用webservice的.asmx接口的使用步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java concurrency之共享鎖和ReentrantReadWriteLock_動力節(jié)點(diǎn)Java學(xué)院整理
本篇文章主要介紹了Java concurrency之共享鎖和ReentrantReadWriteLock,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06啟動Spring項(xiàng)目詳細(xì)過程(小結(jié))
這篇文章主要介紹了啟動Spring項(xiàng)目詳細(xì)過程(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11