一、问题描述

在使用Mybatis-plus的ipage分页查询时,删除最后一页数据后,前端再次调用查询接口,显示当前页无数据。

二、问题原因

前端在删除最后一整页数据后,调用查询接口时仍然查询的是当前页的数据,因此查询结果为空。

三、解决方法

1、前端方法

当前页没有数据时应向前查询一页,pageNum-1

2、后端方法

方法一:手动判断当前页是否有数据,若没有数据则查询前一页

方法二:设置Mybatis-plus分页器,设置overflow属性为true,即查询页面超出范围时,跳转至首页

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
    //设置overflow属性为true
    paginationInnerInterceptor.setOverflow(true);
    interceptor.addInnerInterceptor(paginationInnerInterceptor);
    return interceptor;
}

但通过查看PaginationInnerInterceptor.class源码发现,页面超出范围后Mybatis-plus会默认查询首页数据。

    /**
     * 处理页数溢出,默认设置为第一页
     *
     * @param page IPage
     */
    protected void handlerOverflow(IPage<?> page) {
        page.setCurrent(1);
    }

为了使页面超出范围后能够返回前一页的数据,可以重写handlerOverflow方法:

@Data
@NoArgsConstructor
public class MyPaginationInnerInterceptor extends PaginationInnerInterceptor {
    private DbType dbType;
 
    public MyPaginationInnerInterceptor(DbType dbType){
        this.dbType = dbType;
    }
 
    @Override
    protected void handlerOverflow(IPage<?> page){
        //查询前一页
        page.setCurrent(page.getCurrent() - 1);
    }
}

此时,再设置Mybatis-plus分页器:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    MyPaginationInnerInterceptor paginationInnerInterceptor = new MyPaginationInnerInterceptor(DbType.MYSQL);
    paginationInnerInterceptor.setOverflow(true);
    interceptor.addInnerInterceptor(paginationInnerInterceptor);
    return interceptor;
}

至此问题解决,分页查询超出范围后正常显示结果。

四、mybatis中该问题如何解决?

设置pageHelper中的setReasonable(true)

参考文章:Mybatis分页框架-PageHelper_mybatis pagehelper-CSDN博客 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐