本篇內容主要講解“MybatisPlus中的流式查詢怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MybatisPlus中的流式查詢怎么使用”吧!
mybatis plus 中自定義如下接口,就可以實現流式查詢,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);
一、在需要使用流式查詢的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)表數據庫訪問層
*
* @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;
// 存儲每批數據的臨時容器
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);
// 你可以看自己的項目需要分批進行處理或者單個處理,這里以分批處理為例
mallOrders.add(tblMallOrder);
size++;
if (size == BATCH_SIZE) {
handle();
}
}
});
//用來完成最后一批數據處理
handle();
}
/**
* 數據處理
*/
private void handle(){
try{
// 在這里可以對你獲取到的批量結果數據進行需要的業務處理
}catch (Exception e){
e.printStackTrace();
}finally {
// 處理完每批數據后后將臨時清空
size = 0;
mallOrders.clear();
}
}
}到此,相信大家對“MybatisPlus中的流式查詢怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。