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

Mybatis-plus分頁(yè)查詢不生效問(wèn)題排查全過(guò)程

 更新時(shí)間:2023年03月15日 11:24:09   作者:追尋上飛  
最近寫分頁(yè)的時(shí)候,遇到了分頁(yè)無(wú)法正常發(fā)揮作用的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus分頁(yè)查詢不生效問(wèn)題排查的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、問(wèn)題描述

在查詢的時(shí)候,發(fā)現(xiàn)點(diǎn)擊后臺(tái)的分頁(yè)器數(shù)字,第2頁(yè)時(shí)候,數(shù)據(jù)還是和第1頁(yè)的一致。就看后臺(tái)的數(shù)據(jù)庫(kù)打印語(yǔ)句,如下所示。點(diǎn)擊第一頁(yè)和第二頁(yè)都是這個(gè),limit后的參數(shù)只有一個(gè),前期做過(guò)類似,點(diǎn)擊第二頁(yè)分頁(yè)的時(shí)候,語(yǔ)句是LIMIT ?,?

ON ap.id = a.project_id ORDER BY a.create_time DESC LIMIT ?

二、分析步驟

1.首先開(kāi)始懷疑的是自己的分頁(yè)對(duì)象出現(xiàn)了問(wèn)題,因?yàn)镸ySQL ORM框架使用了JPA框架遺留的代碼。將spring-data的分頁(yè)對(duì)象org.springframework.data.domain.Pageable轉(zhuǎn)成了mybatis-plus的分頁(yè)對(duì)象com.baomidou.mybatisplus.extension.plugins.pagination.Page<T>。

debug后,Page<T>的 current 和 size 都是存在且對(duì)應(yīng)前臺(tái)傳來(lái)的值。

2.接著懷疑是mybatis-plus的攔截器順序問(wèn)題,因?yàn)轫?xiàng)目里寫了數(shù)據(jù)權(quán)限的攔截器,在研究數(shù)據(jù)權(quán)限攔截器的時(shí)候就看到有說(shuō)攔截器添加順序會(huì)影響到SQL語(yǔ)句拼接的正確性。對(duì)比了正常的添加順序后,這部分也沒(méi)有問(wèn)題。

   @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //添加數(shù)據(jù)權(quán)限處理器,注意順序,先數(shù)據(jù)權(quán)限再分頁(yè)
        MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
        // 添加自定義的數(shù)據(jù)權(quán)限處理器
        dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
        interceptor.addInnerInterceptor(dataPermissionInterceptor);

        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }

3.發(fā)現(xiàn)這兩部分都沒(méi)問(wèn)題后,決定還是debug一下分頁(yè)攔截器。

重要的分頁(yè)SQL語(yǔ)句拼接函數(shù)如下。

DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize());

進(jìn)入到里面,這里數(shù)據(jù)庫(kù)使用的MySQL。

public class MySqlDialect implements IDialect {

    @Override
    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
        StringBuilder sql = new StringBuilder(originalSql).append(" LIMIT ").append(FIRST_MARK);
        if (offset != 0L) {
            sql.append(StringPool.COMMA).append(SECOND_MARK);
            return new DialectModel(sql.toString(), offset, limit).setConsumerChain();
        } else {
            return new DialectModel(sql.toString(), limit).setConsumer(true);
        }
    }
}

可以看到偏移量offset至關(guān)重要,決定了拼接的條件判斷。

又發(fā)現(xiàn),offet的值和current相關(guān),根據(jù)排查結(jié)果來(lái)看,current 是正常傳值的。

default long offset() {
        long current = this.getCurrent();
        return current <= 1L ? 0L : Math.max((current - 1L) * this.getSize(), 0L);
    }

因此到這里我們就會(huì)發(fā)現(xiàn),是offset的真實(shí)值不正確。

當(dāng)后臺(tái)前端頁(yè)面?zhèn)鱽?lái)的current0時(shí),offset等于0。

當(dāng)后臺(tái)前端頁(yè)面?zhèn)鱽?lái)的current1時(shí),offset依舊等于0。

而回到拼接函數(shù)buildPaginationSql中,不等于0的時(shí)候才會(huì)有 兩個(gè)參數(shù)的拼接。

至此,這個(gè)問(wèn)題解決了,就是在對(duì)象轉(zhuǎn)換時(shí),沒(méi)有對(duì)current的值進(jìn)行 + 1

三、解決方案

public class MyPage<T> extends Page<T> {

    /**
     * @Description: 將spring的分頁(yè)對(duì)象轉(zhuǎn)成Mybatis
     * @param pageable:
     * @return: null
     **/
    public MyPage(Pageable pageable) {
        this.setSize(pageable.getPageSize());
        this.setCurrent(pageable.getPageNumber() + 1);
    }
}

四、總結(jié)

  • 多用編譯器的debug
  • 細(xì)節(jié)問(wèn)題還是要注意,哪怕一個(gè)變量

到此這篇關(guān)于Mybatis-plus分頁(yè)查詢不生效問(wèn)題排查的文章就介紹到這了,更多相關(guān)Mybatis-plus分頁(yè)查詢不生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自帶IDEA插件的阿里開(kāi)源診斷神器Arthas線上項(xiàng)目BUG調(diào)試

    自帶IDEA插件的阿里開(kāi)源診斷神器Arthas線上項(xiàng)目BUG調(diào)試

    這篇文章主要為大家介紹了自帶IDEA插件阿里開(kāi)源診斷神器Arthas線上項(xiàng)目BUG調(diào)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • java實(shí)現(xiàn)用戶自動(dòng)登錄

    java實(shí)現(xiàn)用戶自動(dòng)登錄

    這篇文章主要為大家詳細(xì)介紹了java用戶自動(dòng)登錄的實(shí)現(xiàn)方法,分為六個(gè)步驟實(shí)現(xiàn)用戶自動(dòng)登錄,并驗(yàn)證用戶是否已經(jīng)登錄,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Java8時(shí)間轉(zhuǎn)換(LocalDateTime)代碼實(shí)例

    Java8時(shí)間轉(zhuǎn)換(LocalDateTime)代碼實(shí)例

    這篇文章主要介紹了java8時(shí)間轉(zhuǎn)換(LocalDateTime)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解Java七大阻塞隊(duì)列之SynchronousQueue

    詳解Java七大阻塞隊(duì)列之SynchronousQueue

    SynchronousQueue不需要存儲(chǔ)線程間交換的數(shù)據(jù),它的作用像是一個(gè)匹配器,使生產(chǎn)者和消費(fèi)者一一匹配。本文詳細(xì)講解了Java七大阻塞隊(duì)列之一SynchronousQueue,需要了解的小伙伴可以參考一下這篇文章
    2021-09-09
  • 基于springMvc+hibernate的web application的構(gòu)建

    基于springMvc+hibernate的web application的構(gòu)建

    下面小編就為大家?guī)?lái)一篇基于springMvc+hibernate的web application的構(gòu)建。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • 一個(gè)簡(jiǎn)易的Java多頁(yè)面隊(duì)列爬蟲(chóng)程序

    一個(gè)簡(jiǎn)易的Java多頁(yè)面隊(duì)列爬蟲(chóng)程序

    這篇文章主要為大家詳細(xì)介紹了一個(gè)多頁(yè)面的java爬蟲(chóng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring?Data?JPA映射自定義實(shí)體類操作

    Spring?Data?JPA映射自定義實(shí)體類操作

    這篇文章主要介紹了Spring?Data?JPA映射自定義實(shí)體類操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用list stream: 任意對(duì)象List拼接字符串

    使用list stream: 任意對(duì)象List拼接字符串

    這篇文章主要介紹了使用list stream:任意對(duì)象List拼接字符串操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口問(wèn)題

    Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口問(wèn)題

    這篇文章主要介紹了Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口,本篇示例我就以Nacos注冊(cè)中心為例了,下面是我注冊(cè)的兩個(gè)服務(wù),需要的朋友可以參考下
    2022-09-09
  • springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)

    springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)

    在我們開(kāi)發(fā)項(xiàng)目過(guò)程中,經(jīng)常需要定時(shí)任務(wù)來(lái)幫助我們來(lái)做一些內(nèi)容,本文介紹了springboot中設(shè)置定時(shí)任務(wù)的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12

最新評(píng)論

高安市| 福泉市| 清流县| 胶州市| 安义县| 土默特左旗| 庆阳市| 轮台县| 桑日县| 资兴市| 柳河县| 丽江市| 瑞昌市| 普格县| 肃宁县| 龙海市| 泸水县| 唐山市| 金华市| 内乡县| 秦皇岛市| 巫溪县| 鹿泉市| 蚌埠市| 南江县| 清水河县| 莱州市| 沾益县| 马关县| 宝鸡市| 嘉峪关市| 大埔县| 韩城市| 准格尔旗| 木兰县| 岳阳县| 昭通市| 都江堰市| 赤壁市| 安徽省| 鄢陵县|