最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus通用中等、大量數(shù)據(jù)分批查詢和處理方法

 更新時間:2025年07月14日 10:53:59   作者:Meta39  
文章介紹MyBatis-Plus分頁查詢處理,通過函數(shù)式接口與Lambda表達(dá)式實現(xiàn)通用邏輯,方法抽象但功能強大,建議擴展分批處理及流式查詢以優(yōu)化大數(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ù)接口實現(xiàn)和數(shù)據(jù)處理接口實現(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 對獲取的分頁數(shù)據(jù)進(jìn)行處理
     */
    public static <T> void findByPage(MyBatisPlusPageFunctionInterface<T> functionInterface, long pageSize, MyBatisPlusFunctionInterface<T> myBatisPlusFunctionInterface) {
        // 參數(shù)校驗
        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++;
        }
    }
}

使用方法

簡單查詢

//批量獲取全部數(shù)據(jù),沒設(shè)置一次取幾條數(shù)據(jù),這里默認(rèn)取1000條。
            MyBatisPlusUtils.findByPage(XXXMapper,//簡單查詢繼承了BaseMapper的Mapper
                    new LambdaQueryWrapper<DataBaseEntity>().isNull(DataBaseEntity::getName)
                    ,//簡單查詢mapper的條件
                    records -> {//處理分頁查詢出來的數(shù)據(jù),如果有多次分頁,則進(jìn)行多次處理。比如有2頁,則下面的方法會執(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) -> {
                        //對傳入的數(shù)據(jù)進(jìn)行處理
                        String param2 = dto.getParam2() + dto.getParam3();
                        return hiBdSrvtmpMedOrdMapper.findPage(page, param2);//使用自定義的分頁方法,并且分頁參數(shù)可以不固定,需要多少個都行。
                    },//使用自定義的分頁方法
                    2000L,//一次取2000條數(shù)據(jù)
                    records -> {
                        //遍歷處理這一批次的數(shù)據(jù)
                        for (HiBdSrvtmpMedOrd record : records) {
                            //處理查詢到的數(shù)據(jù)
                        }
                    }
            );

總結(jié)

上面提供的方式對于初學(xué)者或者沒有系統(tǒng)了解過JAVA8的函數(shù)式接口、lambda表達(dá)式、匿名函數(shù)等新特性的人,理解起來是非常抽象、不好理解的,但是正因為代碼抽象,所以功能才更強大!
還有其它組合使用方式?jīng)]有一一列舉出來,大家可以自行嘗試使用和擴展。
有些功能沒有考慮在內(nèi),比如:分批提交的事務(wù)問題、沒有使用批處理模式(ExecutorType.BATCH)、使用 Cursor進(jìn)行流式查詢(適用于大數(shù)據(jù)量)、多線程處理(代碼會更復(fù)雜,而且我也沒有想過通用這方面的代碼,這方面單獨的代碼會更合適)
有更好的辦法,歡迎留言,謝謝。

到此這篇關(guān)于MyBatis-Plus通用中等、大量數(shù)據(jù)分批查詢和處理的文章就介紹到這了,更多相關(guān)mybatis-plus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 實戰(zhàn)練手項目之醫(yī)院預(yù)約掛號系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)練手項目之醫(yī)院預(yù)約掛號系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+Maven+Vue+mysql實現(xiàn)一個醫(yī)院預(yù)約掛號系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • mybatis如何根據(jù)表逆向自動化生成代碼實例

    mybatis如何根據(jù)表逆向自動化生成代碼實例

    逆向工程是一個專門為 MyBatis 框架使用者設(shè)計的代碼生成器,可以根據(jù)數(shù)據(jù)庫中的表字段名,自動生成 POJO 類,mapper 接口與 SQL 映射文件,這篇文章主要給大家介紹了關(guān)于mybatis如何根據(jù)表逆向自動化生成代碼的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot實現(xiàn)熱部署Community的示例代碼

    SpringBoot實現(xiàn)熱部署Community的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)熱部署Community的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Spring Boot Actuator端點相關(guān)原理解析

    Spring Boot Actuator端點相關(guān)原理解析

    這篇文章主要介紹了Spring Boot Actuator端點相關(guān)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 關(guān)于Tomcat出現(xiàn)The origin server did not find a current representation for the target resourc...的問題

    關(guān)于Tomcat出現(xiàn)The origin server did not find a current represent

    這篇文章主要介紹了關(guān)于Tomcat出現(xiàn)The origin server did not find a current representation for the target resourc...的問題,感興趣的小伙伴們可以參考一下
    2020-08-08
  • SpringBoot3集成Swagger3的詳細(xì)教程

    SpringBoot3集成Swagger3的詳細(xì)教程

    Swagger 3(OpenAPI 3.0)提供了更加強大和靈活的API文檔生成能力,本教程將指導(dǎo)您如何在Spring Boot 3項目中集成Swagger3,并使用Knife4j作為UI界面,需要的朋友可以參考下
    2024-03-03
  • JAVA 添加、修改和刪除PDF書簽的示例代碼

    JAVA 添加、修改和刪除PDF書簽的示例代碼

    這篇文章主要介紹了JAVA 添加、修改和刪除PDF書簽的示例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • SpringBoot中YAML配置文件實例詳解

    SpringBoot中YAML配置文件實例詳解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中YAML配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java一個簡單的紅包生成算法

    Java一個簡單的紅包生成算法

    今天小編就為大家分享一篇關(guān)于Java一個簡單的紅包生成算法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java并發(fā) 線程間的等待與通知

    Java并發(fā) 線程間的等待與通知

    這篇文章主要介紹了Java并發(fā) 線程間的等待與通知,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

禄劝| 滦平县| 罗山县| 玉山县| 绥滨县| 盐津县| 宝山区| 潮安县| 汉沽区| 东方市| 温宿县| 乐平市| 镇原县| 镇安县| 湟源县| 潮安县| 绥化市| 贺州市| 新泰市| 蓬溪县| 清丰县| 响水县| 沂南县| 陆川县| 尼勒克县| 泾川县| 娄底市| 大名县| 东兴市| 千阳县| 蓝田县| 辰溪县| 兴安县| 濮阳县| 大宁县| 盘锦市| 获嘉县| 霍邱县| 汉阴县| 赤壁市| 二连浩特市|