Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制

Posted donotshow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制相关的知识,希望对你有一定的参考价值。

Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制

mybatis-plus处于性能和安全的考虑,默认分页查询的单页最大数量为500(具体代码在PaginationInterceptorintercept方法中),


但是有时候我们需要突破这个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条记录的问题,但是这个是全局的配置,会导致所有的分页都可以突破这个限制,有可能会引发安全或者性能隐患。所以这边我重写了PagePaginationInterceptor来解决问题,使单页最大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记录的限制,又可以自定义突破这个限制而不影响全局。

以上是关于Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

Mybatis-plus 3.4版本 分页插件配置 设置单次查询最大记录数及突破最大限制查询

#yyds干货盘点#MyBatis-plus 从入门到入土 !

springboot整合mybatis-plus+durid数据库连接池