一、问题描述
在使用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)