PageHelper自动增加limit分页

问题

使用PageHelperi分页,报错如下:

Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :’limi1 1 limit ?,?’,expect LIMIT, actual LIMIT limit

原始查询sql(select * from t limit 1)后面有limit1,结果报错显示自动添加上上limit ?,?:

 

排查

见PageHelper 安全调用:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/blob/master/wikis/zh/HowToUse.md#3-pagehelper-安全调用

 

PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

线程中start的page 不能保证线程在当前执行退出时清理完page变量

重现

XXXServiceImpl {
     XX method(Object xx, int pageNum, int pageSize) {
          PageHelper.start(pageNum,pageSize);
          if(xx!=null){
             return XX;
          }
          xxxMapper.find();
            ....
       }
 }

在执行PageHelper.start(pageNum,pageSize);方法后,参数page变量,如xx!=null,直接返回XX,则page没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,如果接下来执行其它sql,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

 

如果PageHelper.start(pageNum,pageSize);之后的方法加了缓存,也会有这个问题。

解决方法 

1.使用参数方式是极其安全的2.保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,必须保证分页和查询同时有效。3.调PageHelper.clearPage(); 可以手动清理 ThreadLocal 存储的分页参,这个是新版本里的方法 其中5.0之后版本注意:

 

1. 配置文件中PageHelper变为了PageInterceptor
<plugin interceptor=”com.github.pagehelper.PageInterceptor”>
2. 不需要<property name=”dialect” value=”mysql”/>,自动识别数据库

### PageHelper 分页查询 LIMIT 拦截解决方案 在使用 MyBatis 的 PageHelper 插件进行分页查询时,插件会自动处理 SQL 中的 `LIMIT` 子句。这意味着开发者无需手动编写复杂的分页逻辑,PageHelper 将根据传入的参数动态调整 SQL 查询语句[^1]。 对于某些数据库而言,直接操作 `LIMIT` 可能引发性能问题或其他兼容性挑战。为了有效应对这些问题并确保分页机制正常工作,可以采取如下措施: #### 配置合理化选项 设置合理的配置项能够帮助更好地控制分页行为。特别是针对 `reasonable` 参数的选择至关重要。当此属性被设为 true 时,表示启用更智能的分页计算模式;反之则关闭该特性。如果应用程序中存在特定需求(比如 offsetAsPageNum 设置),可能需要相应调整 reasonable 属性以适应实际应用场景的要求[^3]。 ```xml <setting name="reasonable" value="true"/> ``` #### 使用 startPage 方法启动分页 推荐的方式是在执行查询前调用 `PageHelper.startPage(int pageNum, int pageSize)` 来初始化分页环境。这种方式不仅简化了编码过程,还使得整个流程更加直观易懂。startPage 调用不会受到上述提到的一些特殊标志位的影响,因此是一个较为稳健的选择。 ```java // 开始分页 PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll(); ``` #### 处理复杂情况下的分页 面对更为复杂的业务场景,如多表联结查询或多条件筛选等情况,建议先构建基础查询再应用分页工具类。这有助于保持原有SQL结构的同时引入必要的分页支持。此外,也可以考虑利用 PageHelper 提供的其他高级功能,例如 rowBounds 或者 page 对象定制等手段进一步增强灵活性和可控度[^2]。 通过以上策略的应用,可以在很大程度上缓解乃至彻底解决因 `LIMIT` 拦截带来的困扰,从而保障系统的稳定性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值