Mybatis-plus3.3及之前版本⽀撑当前分页查询是否允许突破单页最⼤500条数据
的限制
Mybatis-plus3.3及之前版本⽀撑当前分页查询是否允许突破单页最⼤500条数据的限制
mybatis-plus处于性能和安全的考虑,默认分页查询的单页最⼤数量为500(具体代码在PaginationInterceptor的intercept⽅法中),
但是有时候我们需要突破这个500的限制,关于突破500这个限制,现有⽹上已经有很多⼤佬给出了⽅案,根据上⾯的代码来看也很简单,设置limit的值⼩于等于0就可了 。
@Bean
@Order(-2)
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor =new PaginationInterceptor();
paginationInterceptor.tLimit(-1);//突破默认单页最⼤数据500
List<ISqlParr> sqlParrList =new ArrayList<>();
sqlParrList.add(new BlockAttackSqlParr());//攻击 SQL 阻断解析器
paginationInterceptor.tSqlParrList(sqlParrList);
paginationInterceptor.tCountSqlParr(new JsqlParrCountOptimize(true));//count sql join优化
return paginationInterceptor;
}
兔子灯笼制作以上可以解决分页查询可以突破单页最⼤500条记录的问题,但是这个是全局的配置,会导致所有的分页都可以突破这个限制,有可能会引发安全或者性能隐患。所以这边我重写了Page和PaginationInterceptor来解决问题,使单页最⼤500的限制还是默认⽣效,在单个查询中去指定突破这个限制。
1.继承Page,申明是否突破单页最⼤500限制的判断值breachDefaultMaxLimit,根据需求添加构造器。
public class HtPage<T>extends Page<T>{
/**
* ⽤来判断是否允许超过pageSize max值=500的限制
*/
private boolean breachDefaultMaxLimit =fal;
public HtPage(){
}
public HtPage(boolean breachDefaultMaxLimit,long current,long size){
if(current >1){
this.tCurrent(current);
}
this.tSize(size);
this.tTotal(0);
this.tSearchCount(true);
this.breachDefaultMaxLimit = breachDefaultMaxLimit;
}
public boolean isBreachDefaultMaxLimit(){
return breachDefaultMaxLimit;
}
public void tBreachDefaultMaxLimit(boolean breachDefaultMaxLimit){
this.breachDefaultMaxLimit = breachDefaultMaxLimit;
}欢乐的歌
}
2.继承PaginationInterceptor重写handlerLimit⽅法
@Setter
@Accessors(chain =true)
@Intercepts({@Signature(type = StatementHandler.class, method ="prepare", args ={Connection.class, Integer.class})}) public class HtPaginationInterceptor extends PaginationInterceptor {
@Override
protected void handlerLimit(IPage<?> page){
if(page instanceof HtPage){
if(((HtPage<?>) page).isBreachDefaultMaxLimit()){
黄子韬个人简历return;
弹钢琴}
}
super.handlerLimit(page);
}
}
3.注册⾃定义分页拦截器HtPaginationInterceptor小学生检讨
@Configuration
@MapperScan("xxx")
public class MybatisPlusConfigure {
/**
* 注册分页插件
*/
@Bean
@Order(-2)
public PaginationInterceptor paginationInterceptor(){
HtPaginationInterceptor paginationInterceptor =new HtPaginationInterceptor();
寓言小故事大道理List<ISqlParr> sqlParrList =new ArrayList<>();
sqlParrList.add(new BlockAttackSqlParr());
眷顾是什么意思paginationInterceptor.tSqlParrList(sqlParrList);
paginationInterceptor.tCountSqlParr(new JsqlParrCountOptimize(true));
return paginationInterceptor;
}
}
4.使⽤⾃定义分页HtPage进⾏查询,当需要突破单页最⼤500记录限制时breachDefaultMaxLimit设为true
HtPage<T> page =new HtPage<>(true, pageNum,1000);
baMapper.lectPageXXX(page, xxx);
羊肚菜以上,既保留了默认单页最⼤查询500记录的限制,⼜可以⾃定义突破这个限制⽽不影响全局。