Mybatis Plus中的流式查询案例
作者:Jon 时间:2023-08-18 16:35:13
Mybatis Plus流式查询
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);
Mybatis Plus大数据量流式查询
一、在需要使用流式查询的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();
}
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/JonKee/article/details/119935265
标签:Mybatis,Plus,流式查询
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于swing实现窗体拖拽和拉伸
2023-11-12 22:32:40
![](https://img.aspxhome.com/file/2023/2/69082_0s.gif)
Spring Cloud Alibaba使用Nacos作为注册中心和配置中心
2021-07-15 18:18:42
![](https://img.aspxhome.com/file/2023/3/67983_0s.png)
SpringBoot Profile多环境配置方式
2023-12-14 01:44:24
![](https://img.aspxhome.com/file/2023/8/60898_0s.png)
Unity中C#和Java的相互调用实例代码
2022-02-28 13:40:53
整理Java编程中常用的基本描述符与运算符
2022-05-30 01:36:32
Java实现递归计算n的阶乘
2021-06-26 14:34:26
![](https://img.aspxhome.com/file/2023/6/110866_0s.jpg)
Java实战宠物店在线交易平台的实现流程
2022-07-06 22:04:37
![](https://img.aspxhome.com/file/2023/4/119204_0s.png)
Java 容器类源码详解 Set
2022-03-21 18:08:40
使用SpringCloudApiGateway之支持Cors跨域请求
2022-10-15 18:28:08
Flutter 仿微信支付界面
2023-08-30 01:31:53
![](https://img.aspxhome.com/file/2023/2/137812_0s.png)
C# 使用SpecFlow创建BDD测试用例的示例代码
2021-05-25 21:35:00
![](https://img.aspxhome.com/file/2023/7/100227_0s.png)
一文搞懂String的intern()方法
2022-05-28 12:05:35
![](https://img.aspxhome.com/file/2023/8/125608_0s.webp)
Android应用程序模型之应用程序,任务,进程,线程分析
2021-10-09 02:17:45
生产消费者模式实现方式和线程安全问题代码示例
2023-11-26 19:44:17
![](https://img.aspxhome.com/file/2023/0/60040_0s.png)
android操作XML的几种方法总结
2021-08-10 06:06:16
Unity3d 如何更改Button的背景色
2023-10-02 15:48:39
![](https://img.aspxhome.com/file/2023/3/122733_0s.jpg)
Java编程探索之泛型擦除实例解析
2022-08-30 02:13:35
java如何消除太多的if else判断示例代码
2023-01-17 21:57:40
Android RollPagerView实现轮播图
2023-06-12 21:10:32
关于java数组与字符串相互转换的问题
2021-08-08 18:50:31