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 获取分页信息时会得到错误的信息。

相关推荐
格桑阿sir3 小时前
13-大模型智能体开发工程师:工具使用(Tool Use)范式
ai·大模型·agent·工具·智能体·tool·tool use
雾岛心情9 小时前
【小铭邮件】小铭邮件工具箱公司版从PST提取EML邮件
运维·工具·exchage·o365·小铭邮件工具箱(公司版)
私人珍藏库18 小时前
【Android】Soul v5.86.0 内置模块版
android·app·工具·软件·多功能
cup111 天前
[开源] 全屏时钟 / Full Clock:放弃 time.is,用 Svelte 5 写了一个极致纯净的全屏时钟,解决秒数焦虑
开源·工具·时钟·效率·svelte
shandianchengzi1 天前
【记录】Ubuntu26|通过网页和ydotool用手机远程输入文本到电脑上,方便接入手机上优越的语音输入法
ubuntu·手机·工具·输入·软件·输入法
私人珍藏库2 天前
【Android】抖音无水印下载安卓端 轻载 QingZai v1.0.4
android·app·工具·软件·多功能
私人珍藏库2 天前
【PC】[吾爱大神原创工具] PDFImageViewer V1 永久免费的PDF图像查看和导出工具
windows·pdf·工具·软件·多功能
私人珍藏库3 天前
[Android] 全能语音计算器v4.6
人工智能·windows·语音识别·工具·软件·多功能
雾岛心情4 天前
【邮件管理】小铭邮件管理之IMAP收取特定的目录和特定时间邮件
服务器·工具·o365·小铭邮件工具箱(公司版)
小贺儿开发4 天前
Unity UGUI 可视化热区编辑与交互系统
unity·编辑器·游戏引擎·交互·工具·适配·ugui