MyBatis-Plus通用中等、大量數(shù)據(jù)分批查詢和處理方法
函數(shù)式接口
獲取分頁數(shù)據(jù)接口
主要用于獲取數(shù)據(jù)
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@FunctionalInterface
public interface MyBatisPlusPageFunctionInterface<T> {
Page<T> selectPage(Page<T> page);
}數(shù)據(jù)處理接口
import java.util.List;
@FunctionalInterface
public interface MyBatisPlusFunctionInterface<T> {
void execute(List<T> tList);
}通用邏輯工具類
用于執(zhí)行分頁數(shù)據(jù)接口實(shí)現(xiàn)和數(shù)據(jù)處理接口實(shí)現(xiàn)邏輯
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* MyBatis-Plus 工具類
*/
public final class MyBatisPlusUtils {
public static final int DEFAULT_PAGE_SIZE_INT = 1000;
public static final long DEFAULT_PAGE_SIZE = 1000L;
private MyBatisPlusUtils() {
}
/**
* 無條件分頁查詢N條(N由調(diào)用方?jīng)Q定)
*
* @param extendsBaseMapperClass 繼承了BaseMapper的Mapper接口
* @param myBatisPlusFunctionInterface 業(yè)務(wù)邏輯
*/
public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
findByPage(extendsBaseMapperClass, null, pageSize, myBatisPlusFunctionInterface);
}
/**
* 無條件分頁查詢(默認(rèn)每次取1000條,直到取完為止)
*
* @param extendsBaseMapperClass 繼承了BaseMapper的Mapper接口
* @param myBatisPlusFunctionInterface 業(yè)務(wù)邏輯
*/
public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
findByPage(extendsBaseMapperClass, null, DEFAULT_PAGE_SIZE, myBatisPlusFunctionInterface);
}
/**
* 有條件分頁查詢(默認(rèn)每次取1000條,直到取完為止)
*
* @param extendsBaseMapperClass 繼承了BaseMapper的Mapper接口
* @param myBatisPlusFunctionInterface 業(yè)務(wù)邏輯
*/
public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, LambdaQueryWrapper<T> lambdaQueryWrapper, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
findByPage(extendsBaseMapperClass, lambdaQueryWrapper, DEFAULT_PAGE_SIZE, myBatisPlusFunctionInterface);
}
/**
* 后端分頁查詢所有數(shù)據(jù)
*
* @param extendsBaseMapperClass 繼承了BaseMapper的Mapper接口
* @param myBatisPlusFunctionInterface 業(yè)務(wù)邏輯
*/
public static <T> void findByPage(BaseMapper<T> extendsBaseMapperClass, LambdaQueryWrapper<T> lambdaQueryWrapper, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
findByPage((Page<T> page) -> extendsBaseMapperClass.selectPage(page, lambdaQueryWrapper), pageSize, myBatisPlusFunctionInterface);
}
/**
* 通用分頁查詢方法
*
* @param functionInterface 獲取分頁數(shù)據(jù)的方法
* @param pageSize 每次獲取的數(shù)據(jù)量
* @param myBatisPlusFunctionInterface 對(duì)獲取的分頁數(shù)據(jù)進(jìn)行處理
*/
public static <T> void findByPage(MyBatisPlusPageFunctionInterface<T> functionInterface, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
// 參數(shù)校驗(yàn)
Assert.isTrue(pageSize > 0, "每頁大小必須大于 0");
Assert.notNull(myBatisPlusFunctionInterface, "數(shù)據(jù)處理邏輯不能為 null");
int currentPage = 1;
while (true) {
Page<T> tPage = functionInterface.selectPage(Page.of(currentPage, pageSize));
long pages = tPage.getPages();
List<T> records = tPage.getRecords();
//數(shù)據(jù)為空
if (CollectionUtils.isEmpty(records)) {
return;
}
// 業(yè)務(wù)邏輯
myBatisPlusFunctionInterface.execute(records);
//最后一頁
if (pages <= currentPage) {
return;
}
currentPage++;
}
}
}使用方法
簡(jiǎn)單查詢
//批量獲取全部數(shù)據(jù),沒設(shè)置一次取幾條數(shù)據(jù),這里默認(rèn)取1000條。
MyBatisPlusUtils.findByPage(XXXMapper,//簡(jiǎn)單查詢繼承了BaseMapper的Mapper
new LambdaQueryWrapper<DataBaseEntity>().isNull(DataBaseEntity::getName)
,//簡(jiǎn)單查詢mapper的條件
records -> {//處理分頁查詢出來的數(shù)據(jù),如果有多次分頁,則進(jìn)行多次處理。比如有2頁,則下面的方法會(huì)執(zhí)行2次。
List<DataBaseEntity> l = new ArrayList<>(MyBatisPlusUtils.DEFAULT_PAGE_SIZE_INT);
//遍歷處理這一批次的數(shù)據(jù)
for (DataBaseEntity record : records) {
//處理查詢到的數(shù)據(jù)
}
}
});自定義查詢方法
//自定義查詢方法
MyBatisPlusUtils.findByPage(
(Page<HiBdSrvtmpMedOrd> page) -> {
//對(duì)傳入的數(shù)據(jù)進(jìn)行處理
String param2 = dto.getParam2() + dto.getParam3();
return hiBdSrvtmpMedOrdMapper.findPage(page, param2);//使用自定義的分頁方法,并且分頁參數(shù)可以不固定,需要多少個(gè)都行。
},//使用自定義的分頁方法
2000L,//一次取2000條數(shù)據(jù)
records -> {
//遍歷處理這一批次的數(shù)據(jù)
for (HiBdSrvtmpMedOrd record : records) {
//處理查詢到的數(shù)據(jù)
}
}
);總結(jié)
上面提供的方式對(duì)于初學(xué)者或者沒有系統(tǒng)了解過JAVA8的函數(shù)式接口、lambda表達(dá)式、匿名函數(shù)等新特性的人,理解起來是非常抽象、不好理解的,但是正因?yàn)榇a抽象,所以功能才更強(qiáng)大!
還有其它組合使用方式?jīng)]有一一列舉出來,大家可以自行嘗試使用和擴(kuò)展。
有些功能沒有考慮在內(nèi),比如:分批提交的事務(wù)問題、沒有使用批處理模式(ExecutorType.BATCH)、使用 Cursor進(jìn)行流式查詢(適用于大數(shù)據(jù)量)、多線程處理(代碼會(huì)更復(fù)雜,而且我也沒有想過通用這方面的代碼,這方面單獨(dú)的代碼會(huì)更合適)
有更好的辦法,歡迎留言,謝謝。
到此這篇關(guān)于MyBatis-Plus通用中等、大量數(shù)據(jù)分批查詢和處理的文章就介紹到這了,更多相關(guān)mybatis-plus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中字符串緩沖區(qū)StringBuffer類的使用
StringBuffer與String類似,只不過StringBuffer在進(jìn)行字符串處理時(shí)不生成新的對(duì)象,下面我們就來詳解Java中字符串緩沖區(qū)StringBuffer類的使用:2016-06-06
幾句話說清session,cookie和token的區(qū)別及說明
這篇文章主要介紹了幾句話說清session,cookie和token的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
詳解Spring Boot配置文件application.properties
在本文中我們給大家整理了關(guān)于Spring Boot 的配置文件 application.properties的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考學(xué)習(xí)下。2019-06-06
Mybatis-plus更新字段為null兩種常用方法及優(yōu)化
Mybatis Plus在進(jìn)行更新操作時(shí),默認(rèn)情況下是不能將字段更新為null的,如果要更新字段為null,需要進(jìn)行以下處理,這篇文章主要給大家介紹了關(guān)于Mybatis-plus更新字段為null的兩種常用方法及優(yōu)化,需要的朋友可以參考下2024-03-03
Java數(shù)據(jù)結(jié)構(gòu)--時(shí)間和空間復(fù)雜度

