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.setLimit(-1);//突破默认单页最⼤数据500
List<ISqlParser> sqlParserList =new ArrayList<>();
sqlParserList.add(new BlockAttackSqlParser());//攻击 SQL 阻断解析器
paginationInterceptor.setSqlParserList(sqlParserList);
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(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 =false;
public HtPage(){
}
public HtPage(boolean breachDefaultMaxLimit,long current,long size){
if(current >1){
this.setCurrent(current);
}
this.setSize(size);
this.setTotal(0);
this.setSearchCount(true);
this.breachDefaultMaxLimit = breachDefaultMaxLimit;
}
public boolean isBreachDefaultMaxLimit(){
return breachDefaultMaxLimit;
}
public void setBreachDefaultMaxLimit(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<ISqlParser> sqlParserList =new ArrayList<>();
sqlParserList.add(new BlockAttackSqlParser());
paginationInterceptor.setSqlParserList(sqlParserList);
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
4.使⽤⾃定义分页HtPage进⾏查询,当需要突破单页最⼤500记录限制时breachDefaultMaxLimit设为true
HtPage<T> page =new HtPage<>(true, pageNum,1000);
baseMapper.selectPageXXX(page, xxx);
以上,既保留了默认单页最⼤查询500记录的限制,⼜可以⾃定义突破这个限制⽽不影响全局。