PageHelper插件注意事项

PageHelper插件注意事项

  • 使用PageHelper.startPage后要紧跟查询语句

    下面的代码就有可能出问题:

    java 复制代码
    PageHelper.startPage(10, 10);
    if(param != null) {
        List<Data> data = dataMapper.select(example);
    }

    因为如果param == null,那么就会导致设置了分页插件但却没有执行查询,此时 PageHelper 已经在当前线程的 ThreadLocal 里面设置了分页参数,但是没有被消费,这个参数就会一直保存在这个线程里。当这个线程继续往后跑或者被复用时遇到一条 SQL 语句, 就可能会导致不该分页的方法去消费这个分页参数,导致预期之外的结果。所以上面的代码应该写出下面这样,保证使用分页插件后立即执行 SQL 语句。

    java 复制代码
    PageHelper.startPage(10, 10);
    List<Data> data = dataMapper.select(example);

    这样就不会污染线程,PageHelper 插件内部会在执行完 SQL 语句后自动清除在 ThreadLocal 中存储的分页信息。

  • PageInfo获取分页信息

    对于上面的代码,可以使用下面的代码获取分页信息:

    java 复制代码
    PageInfo info = new PageInfo(data);

    这是因为使用 PageHelper 后,mybatis 执行查询返回的 List 被 PageHelper 拦截处理了,最终返回的 List 是 Page 的子类,里面保存有分页信息,这点可以通过 PageInfo 的构造函数看出:

    java 复制代码
    public PageInfo(List<? extends T> list, int navigatePages) {
            super(list);
            this.isFirstPage = false;
            this.isLastPage = false;
            this.hasPreviousPage = false;
            this.hasNextPage = false;
            if (list instanceof Page) {		
                Page page = (Page)list;		// 在这里打断点使用分页插件返回的List会通过该if判断
                this.pageNum = page.getPageNum();
                this.pageSize = page.getPageSize();
                this.pages = page.getPages();
                this.size = page.size();
                if (this.size == 0) {
                    this.startRow = 0L;
                    this.endRow = 0L;
                } else {
                    this.startRow = page.getStartRow() + 1L;
                    this.endRow = this.startRow - 1L + (long)this.size;
                }
            }
    		...
    }

    所以尽量不要修改分页插件返回的 List,否则通过 PageInfo 获取分页信息时会得到错误的信息。

相关推荐
jingxindeyi12 天前
excel实用工具
excel·工具
nSponge22 天前
【Duilib】 List控件支持多选和获取选择的多条数据
c++·windows·工具
架构文摘JGWZ24 天前
一键完成!!网页打包成桌面应用
开发语言·学习·开源软件·工具
cxsj99924 天前
idea项目导入gitee 码云
git·gitee·工具·码云
selfboot01 个月前
在线免费批量生成 Word 文档工具
word·excel·工具·批量生成
梦起丶1 个月前
Qt 中实现系统主题感知
qt·ui·工具·qml
图灵追慕者1 个月前
大语言模型学习工具及资源总结和落地应用
大语言模型·工具·落地应用·相关资源
架构文摘JGWZ1 个月前
高效!!自动运维平台
学习·工具
H轨迹H1 个月前
一款渗透测试信息收集集成工具--mitan密探
网络安全·渗透测试·工具·信息收集
AzulX2 个月前
基于 .NET 的 Nuget 发版工具
工具·nuget