PageHelper分页不起作用的原因分析

 阅读约 3 分钟

做项目的时候遇到问题发现前台查询总条数一直显示的是0或1这样不正确的数字,我的代码类似这样
`

Page<Object> result = PageHelper.startPage(query.getPage(), query.getLimit());
//查询是否是某角色
List<GroupMember> glist = groupMemberMapper.selectByUserIdAndGroupId(BaseContextHandler.getUserID(), "roleType");
List<Object> list = this.selectByExample(example);

`
后来到PageHelper作者的GitHub主页才发现原因是PageHelper.startPage所放在程序的位置的原因,附链接:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md
教程中写到:
“在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。”
image.png
因为PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。

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

如果代码在进入Executor前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到MappedStatement时), 这种情况由于线程不可用,也不会导致ThreadLocal参数被错误的使用。
错误的例子:
image.png
正确的例子:
image.png

阅读 263发布于 11月13日
推荐阅读
目录