pagePageHelper.startPage;超过总数重复分页

发布时间 2023-08-30 14:49:16作者: 白玉神驹

问题

使用PageHelper时发现超过最大数量(20)的页数,仍然可以返回数据

解决方案

#分页插件
pagehelper:
  helperDialect: mysql
  reasonable: false
  supportMethodsArguments: true
  params: countSql
  #分页插件会自动检测当前的数据库链接,自动选择合适的分页方式
  auto-dialect: true
  #默认false, true/允许在运行时根据多数据源自动识别对应方言的分页
  auto-runtime-dialect: true

将上述reasonable修改为false即可

问题分析

1. 在Mybatis中配置打印sql日志

mybatis:  
  configuration:  
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2. 请求接口查看

总数20条,分页参数为1,10

2.1 pageHelper会先count(0)查询总数量结果为20

2.2 分页查询sql为 limit 10;

总数20条,分页参数为2,10

2.3 pageHelper会先count(0)查询总数量结果为20

2.4 分页查询sql为 limit 10,10;

总数20条,分页参数为3,10

2.3 pageHelper会先count(0)查询总数量结果为20

2.4 分页查询sql为 limit 10,10;重复下去

源码分析

在拦截器PageInterceptor中,调用AbstractHelperDialect.afterCount方法判断是否继续进行分页

 在AbstractHelperDialect.afterCount方法中会调用Page.setTotal

 在Page.setTotal方法中会对分页进行合理化判断,不合理的页码会自动处理,把最大页数赋值给当前页数,

 并且通过calculateStartAndEndRow方法重新计算起止号

 所以,如果在mybatis的config文件中把reasonable设置为false,分页插件就不会给我们自动进行分页合理化了。