2022-11-02 mysql 最多查询条数限制 分页count最大值限制

/**

SELECT COUNT(*) AS total from table 数据贼多的时候 分页上千,上万,几百万页,明显不实用的分页

不符合需求,但是还要分20页,100页啥的 可以用

* sql拦截器

* @author lure

*/

@Intercepts({

@Signature(type = StatementHandler.class, method ="prepare", args = {Connection.class, Integer.class})

})

@Slf4j

public class TableLimitInterceptorimplements Interceptor {

@Value("${limitNum:12222}")

IntegerlimitNum;

    // 拦截器拦截后对象后,执行自己的业务逻辑

    @Override

    public Objectintercept(Invocation invocation)throws Throwable {

try {

// 入参invocation指拦截到的对象

            StatementHandler handler = (StatementHandler) invocation.getTarget();

            BoundSql boundSql = handler.getBoundSql();

            String sql = boundSql.getSql();

            MySqlStatementParser mySqlStatementParser =new MySqlStatementParser(sql);

            SQLStatement statement = mySqlStatementParser.parseStatement();

            if (statementinstanceof SQLSelectStatement) {

SQLSelect selectQuery = ((SQLSelectStatement) statement).getSelect();

                MySqlSelectQueryBlock sqlSelectQuery = (MySqlSelectQueryBlock) selectQuery.getQuery();

                String tableName = sqlSelectQuery.getFrom().toString();

                SQLLimit limit = sqlSelectQuery.getLimit();

                // 拦截 带有limit 并且 


                if(null == limit && sql.contains("SELECT COUNT(*) AS total")){

                    String str ="SELECT COUNT(*) AS total";

                    String newSql = sql.replace(str,"SELECT COUNT(*) AS total from (select 1  ");

                    newSql = newSql +" limit "+limitNum +" ) as 20220101lure";

                    // 修改sql

                    ReflectUtil.setFieldValue(boundSql, "sql", newSql);

                }

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容