🚀 【踩坑记录】没调 startPage(),SQL 却被自动分页了?
1. 现象
Controller 中没写 PageHelper.startPage(),但执行 SQL 时末尾自动出现了 LIMIT,导致查询结果数量不对。
2. 核心原因:ThreadLocal 污染
PageHelper 的分页参数存放在 ThreadLocal 中。
- 脏数据来源 :如果前一个请求调用了
startPage()但没有执行查询 (由于异常或if逻辑提前返回),分页参数会残留在线程中。 - 线程池复用:Tomcat 线程池会复用线程。下一个请求(即你的接口)碰巧使用了这个"脏线程",PageHelper 拦截器就会自动读取残余参数并触发分页。
3. 诱因:参数自动匹配 (supportMethodsArguments)
检查配置文件:pagehelper.supportMethodsArguments: true。
如果开启此项,PageHelper 会自动反射扫描你的请求对象。只要你的公共类里有 pageNum 和 pageSize 字段且不为空,它就会自动开启分页,无需手动调用。
4. 解决方案
-
规范化 :确保
startPage()后紧跟查询,或在finally块执行PageHelper.clearPage()。 -
改配置 :建议将
support-methods-arguments设为false,由代码显式控制分页,减少"黑盒"行为。ymlpagehelper: support-methods-arguments: false -
强力清空 :在不需要分页的接口开头手动调用
PageHelper.clearPage()以防万一。