暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

PageHelper使用不规范导致sql中莫名其妙的多出limit

一叶扁舟 2021-09-06
3935

我们项目中如果使用的PageHelper,有时候sql会莫名其妙的多出来一个limit,这是PageHelper使用不规范导致的

WechatIMG843.jpeg

一、PageHelper官网解释

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

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

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

但是如果你写出下面这样的代码,就是不安全的用法:

PageHelper.startPage(1, 10); List<Country> list; if(param1 != null){ list = countryMapper.selectIf(param1); } else { list = new ArrayList<Country>(); }

这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

上面这个代码,应该写成下面这个样子:

List<Country> list; if(param1 != null){ PageHelper.startPage(1, 10); list = countryMapper.selectIf(param1); } else { list = new ArrayList<Country>(); }

这么写很不好看,而且没有必要。

以上来自于PageHelper官网:如何使用分页插件

二、总结

所以,为了避免:线程1调用方法1,产生了分页但是没消费,然后被放回线程池了,然后线程1调方法2,即使方法2整个方法都没用pagehelper,也会被分页(sql拼接上limit),因此,PageHelper的使用一定要规范,保证想要分页的sql必须紧放在PageHelper创建后,并且保证该sql必须能被执行到。

最后修改时间:2024-07-03 22:49:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论