因为做的是门户类型的项目.这两天测试给提了个问题,在分页的时候,直接从地址栏修改了一个超出最大页码的页数,返回的结果竟然是空白页面,平时前后端分离的时候,没有碰到过,现在有两种解决方式:
- 后端处理
- 前端调用接口的时候根据maxPage进行判断
当然第二种处理方式比较简单,但是依稀记得以前用的分页pageHelper插件超出最大值时会自动判断,故做一下研究 通过查询mybatis-plus的官网,MybatisPlusInterceptor 其中的自动分页是比较符合的
代码语言:javascript复制自动分页: PaginationInnerInterceptor
代码语言:javascript复制多租户: TenantLineInnerInterceptor
代码语言:javascript复制动态表名: DynamicTableNameInnerInterceptor
代码语言:javascript复制乐观锁: OptimisticLockerInnerInterceptor
代码语言:javascript复制sql 性能规范: IllegalSQLInnerInterceptor
代码语言:javascript复制防止全表更新与删除: BlockAttackInnerInterceptor
通过重写PaginationInnerInterceptor的方法,可以实现的有:
代码语言:javascript复制overflow 溢出总页数后是否进行处理(我们需要的东西),
代码语言:javascript复制maxLimit 单页分页条数限制(默认无限制),
代码语言:javascript复制dbType 数据库类型(根据类型获取应使用的分页方言) ,
代码语言:javascript复制dialect 方言实现类
下面的代码是超出最大页返回第一页
代码语言:javascript复制 @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置最大分页数
paginationInnerInterceptor.setMaxLimit(100L);
// 是否对超过最大分页时做溢出处理
paginationInnerInterceptor.setOverflow(true);
// 设置数据库类型
paginationInnerInterceptor.setDbType(DbType.MARIADB);
//paginationInnerInterceptor.setProperties();
// paginationInnerInterceptor.setDialect();
//paginationInnerInterceptor.setOptimizeJoin();
// 添加分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
而想返回最后一页的话,要重写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
* 分页删除某页唯一记录后,自动跳转至前一页(默认实现是跳转至首页)
*/
@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);
}
}
- 修改MyBatis Plus配置,使用NewPaginationInnerInterceptor:
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//设置分页插件属性:请求页超出范围时,返回前一页
NewPaginationInnerInterceptor paginationInnerInterceptor = new NewPaginationInnerInterceptor
paginationInnerInterceptor.setOverflow(true);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
但是在写的时候,突然发现idea没有提示,自己写上去也是报错的...后来发现mybatis-plus插件版本要求3.4.0以上,而项目中的是3.2的版本 项目开始的时候3.4.0还未发布, 查询了一下3.4之前的版本设置,跟现有版本的实现逻辑不一样,只能够设置超出跳转第一页... 幸好前端也可以解决,留下的疑问,只好后面如果碰到再解决吧