MyBatis-Plus分頁:刪除最后一頁最后一條數(shù)據(jù)后顯示無數(shù)據(jù)(后端解決方法)

1攒霹、問題描述

MyBatis-Plus使用Ipage分頁查詢數(shù)據(jù)時(shí)怯疤,刪除最后一頁全部數(shù)據(jù)后,再次調(diào)用查詢接口催束,顯示當(dāng)前頁無數(shù)據(jù)集峦。
例如:共有21條數(shù)據(jù),每頁顯示10條數(shù)據(jù)抠刺,刪除最后一條數(shù)據(jù)(第3頁的唯一一條數(shù)據(jù))后塔淤,頁面跳轉(zhuǎn)至第二頁,但是顯示無數(shù)據(jù)矫付。

分頁查詢代碼如下(Repository層):

//分頁查詢列表
    @Override
    public IPage<SiteType> getAllByOrgIdAndPagination(String orgId, Pagination pagination) {
        //Page從第1頁開始凯沪,Pagination從第0頁開始
        IPage<SiteType> page = new Page<>(pagination.getCurrent() + 1, pagination.getPageSize());
        Wrapper<SiteType> queryWrapper = Wrappers.lambdaQuery(SiteType.class)
                .eq(SiteType::getOrgId, orgId)
                .orderByDesc(SiteType::getCreateTime);
        return siteTypeMapper.selectPage(page,queryWrapper);
    }

2、問題原因

查詢接口只查詢當(dāng)前頁的數(shù)據(jù)买优,在最后一頁(第3頁)刪除最后一條數(shù)據(jù)后,前端仍查詢當(dāng)前頁(第3頁)的數(shù)據(jù),結(jié)果為空杀赢。
因此需要判斷當(dāng)前頁是否有數(shù)據(jù)烘跺,若無數(shù)據(jù),需要進(jìn)行處理脂崔,如跳轉(zhuǎn)至前一頁或首頁滤淳。本文介紹后端處理方法。

3砌左、解決方法

方法一:手動(dòng)判斷當(dāng)前頁是否有數(shù)據(jù)(不推薦)

在Service層判斷當(dāng)前頁是否有數(shù)據(jù)脖咐,若無數(shù)據(jù),查詢前一頁:

    @Override
    public SiteTypeListDTO getSiteTypeList(SiteTypeListRequest request) {
        User user = ContextUserHolder.get();
        IPage<SiteType> siteTypeIPage = siteTypeRepository.getAllByOrgIdAndPagination(user.getOrgId(), request.getPagination());
        Pagination pagination = new Pagination(siteTypeIPage.getCurrent() - 1, siteTypeIPage.getSize(), siteTypeIPage.getTotal(), null);

        //如果當(dāng)前頁沒有數(shù)據(jù)(如刪除某頁的唯一一條數(shù)據(jù))汇歹,重新獲取前一頁的記錄
        //例如查詢第3頁時(shí)屁擅,current:2,pageSize:10产弹,如果total<=20,則current-=1
        if (pagination.getCurrent() * pagination.getPageSize() >= pagination.getTotal() && pagination.getCurrent() != 0) {
            //request中的current減1
            request.getPagination().setCurrent(request.getPagination().getCurrent() - 1);
            siteTypeIPage = siteTypeRepository.getAllByOrgIdAndPagination(user.getOrgId(), request.getPagination());
            pagination.setCurrent(pagination.getCurrent() - 1);
        }

        List<SiteTypeDTO> siteTypeList = siteTypeIPage.getRecords().stream()
                .map(siteType -> convert2SiteTypeDTO(siteType, user.getLocale())).collect(Collectors.toList());
        return new SiteTypeListDTO(siteTypeList, pagination);
    }

方法二:設(shè)置分頁插件屬性(推薦)

參考mybatis plus分頁插件設(shè)置派歌,配置mybatis plus分頁器,設(shè)置overflow屬性為true(查詢頁面超出范圍時(shí)痰哨,跳轉(zhuǎn)至首頁):

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

        //設(shè)置分頁插件屬性:請(qǐng)求頁超出范圍時(shí)胶果,返回首頁
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);        
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);

        return interceptor;
    }    
}

設(shè)置Overflow屬性為true后,刪除最后一頁最后一條數(shù)據(jù)后頁面空白的問題就解決了斤斧。

修改Overflow處理邏輯:無數(shù)據(jù)時(shí)查詢前一頁數(shù)據(jù)

查看PaginationInnerInterceptor.class源碼發(fā)現(xiàn)早抠,頁面超出范圍后的處理是查詢第1頁數(shù)據(jù):

    protected boolean continuePage(IPage<?> page) {
        if (page.getTotal() <= 0L) {
            return false;
        } else {
            if (page.getCurrent() > page.getPages()) {
                if (!this.overflow) {
                    return false;
                }
                this.handlerOverflow(page);
            }
            return true;
        }
    }

    //頁面超出范圍時(shí),返回第1頁    
    protected void handlerOverflow(IPage<?> page) {
        page.setCurrent(1L);
    }

為了保持刪除后的查詢邏輯一致(刪除后返回當(dāng)頁撬讽,當(dāng)頁無數(shù)據(jù)返回前一頁蕊连,而不是首頁),可以重寫handlerOverflow方法如下:
①新建NewPaginationInnerInterceptor 類锐秦,重寫handlerOverflow方法:

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author Tony brings water
 * @date 2021/8/18 14:10
 * 分頁刪除某頁唯一記錄后咪奖,自動(dòng)跳轉(zhuǎn)至前一頁(默認(rèn)實(shí)現(xiàn)是跳轉(zhuǎn)至首頁)
 */
@Data
@NoArgsConstructor
public class NewPaginationInnerInterceptor extends PaginationInnerInterceptor {
    private DbType dbType;

    public NewPaginationInnerInterceptor(DbType dbType) {
        this.dbType = dbType;
    }

    @Override
    protected void handlerOverflow(IPage<?> page) {
        //查詢前一頁
        page.setCurrent(page.getCurrent() - 1);
    }
}

具體跳轉(zhuǎn)邏輯可根據(jù)業(yè)務(wù)自定義。
②修改MyBatis Plus配置酱床,使用NewPaginationInnerInterceptor:

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

        //設(shè)置分頁插件屬性:請(qǐng)求頁超出范圍時(shí)羊赵,返回前一頁        
        NewPaginationInnerInterceptor paginationInnerInterceptor = new NewPaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);

        return interceptor;
    }    
}

至此,問題解決扇谣,刪除最后一頁最后一條數(shù)據(jù)后昧捷,頁面能夠正確顯示結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載罐寨,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者靡挥。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸯绿,隨后出現(xiàn)的幾起案子跋破,更是在濱河造成了極大的恐慌簸淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毒返,死亡現(xiàn)場(chǎng)離奇詭異租幕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拧簸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門劲绪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盆赤,你說我怎么就攤上這事贾富。” “怎么了牺六?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵颤枪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我兔乞,道長(zhǎng)汇鞭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任庸追,我火速辦了婚禮霍骄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淡溯。我一直安慰自己读整,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布咱娶。 她就那樣靜靜地躺著米间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膘侮。 梳的紋絲不亂的頭發(fā)上屈糊,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音琼了,去河邊找鬼逻锐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雕薪,可吹牛的內(nèi)容都是我干的昧诱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼所袁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盏档!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燥爷,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蜈亩,失蹤者是張志新(化名)和其女友劉穎懦窘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勺拣,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奶赠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年鱼填,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了药有。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苹丸,死狀恐怖愤惰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赘理,我是刑警寧澤宦言,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站商模,受9級(jí)特大地震影響奠旺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜施流,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一响疚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞪醋,春花似錦忿晕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宾巍,卻和暖如春咕幻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶霞。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工肄程, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人确丢。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓绷耍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鲜侥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褂始,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容