PageHelper插件注意事项

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

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

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

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

    PageHelper.startPage(10, 10);
    List<Data> data = dataMapper.select(example);

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

  • PageInfo获取分页信息

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

    PageInfo info = new PageInfo(data);

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

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

PageHelper插件注意事项的更多相关文章

  1. 传统方式和插件方式 分别实现 分页 功能 pageHelper 插件

    实现分页  这里提供两种方式  一种是传统的分页方式  一种是基于pageHelper插件 实现的分类     推荐使用后者 前者是一般开发的方式   思路  先手动创建一个 pageUtil 工具 ...

  2. 使用PageHelper插件分页结合mybatis返回的列表个数不对问题解决

    问题描述:spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对.比如每页查询10条,返回2条或者3条.r ...

  3. mybatis分页 -----PageHelper插件

    对查询结果进行分页 一,使用limit进行分页 1.mybatis 的sql语句: <if test="page !=null and rows !=null"> li ...

  4. pageHelper插件

    mybatis的分页插件使用总结 环境准备工作:    1.在使用pagehelper插件时,我已经搭建好了ssm(spring+springmvc+mybatis) 在这简单描述一下ssm搭建过程 ...

  5. Mybatis中使用PageHelper插件进行分页

    分页的场景比较常见,下面主要介绍一下使用PageHelper插件进行分页操作: 一.概述: PageHelper支持对mybatis进行分页操作,项目在github地址: https://github ...

  6. springboot结合mybatis使用pageHelper插件进行分页查询

    1.pom相关依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  7. 【异常】诡异的mysql错误,Pagehelper插件混乱导致吗

    1 详细的异常信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in ...

  8. 在项目中配置PageHelper插件时遇到类型转换异常

    PageHelper是一种常用的分页工具,按照常规方法在mybatis的配置文件中整合它: <?xml version="1.0" encoding="UTF-8& ...

  9. SpringBoot整合mybatis使用pageHelper插件进行分页操作

    SpringBoot整合mybatis分页操作 SpringBoot整合Mybatis进行分页操作,这里需要使用Mybatis的分页插件:pageHelper, 关于pageHelper的介绍,请查看 ...

  10. springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件

    整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...

随机推荐

  1. 【python】调用钉钉机器人发起通知

    有时候需要做个某些服务的状态监控,用钉钉机器人发通知挺方便的.可以用shell脚本配合crontab检测状态,检测到异常就调用python脚本发起告警. python内容 此处用的python3,需要 ...

  2. nlp入门(二) :商品信息可视化与文本分析实战

    源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:麦卡里价格建议挑战Mercari Price Suggestion Challenge | Kaggl ...

  3. 利用pytorch自定义CNN网络(二):数据集的准备

    本文是利用pytorch自定义CNN网络系列的第二篇,主要介绍构建网络前数据集的准备,关于本系列的全文见这里. 笔者的运行设备与软件:CPU (AMD Ryzen 5 4600U) + pytorch ...

  4. el-date-picker 在表单中宽度(width)问题

    在使用element-plus的日期选择组件 el-date-picker的时候,发现form表单内的日期选择框并不能跟el-input 一样把宽度撑满.而是要小一圈. 这样在排版中显得不太整齐,但是 ...

  5. 9.1 C++ STL 排序、算数与集合

    C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法.在STL中,排序.算数和集合算法是常用的 ...

  6. 利用AI点亮副业变现:5个变现实操案例的启示

    整体思维导图: 在这里先分享五个实操案例: 宝宝起名服务 AI科技热点号 头像壁纸号 小说推广号 流量营销号 你们好,我是小梦. 最初我计划撰写一篇关于AI盈利策略的文章,对AI目前的技术走向.应用场 ...

  7. 记一次weak_up函数绕过

    2023 蓝帽杯CTF LovePHP 因为比赛已经结束,所以复现环境是从本地进行复现,这次比赛本来排名挺靠前的,原本总排名是60多名,赛区排名30多名,本来是以为有希望进入半决赛的,但是没想到比赛结 ...

  8. 浅谈API安全的应用

    ​ 理论基础 API它的全称是Application Programming Interface,也叫做应用程序接口,它定义了软件之间的数据交互方式.功能类型.随着互联网的普及和发展,API 从早期的 ...

  9. 1.15 自实现GetProcAddress

    在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块 ...

  10. 使用 Sealos 一键部署高可用 MinIO,开启对象存储之旅

    大家好!今天这篇文章主要向大家介绍如何通过 Sealos 一键部署高可用 MinIO 集群. MinIO 对象存储是什么? 对象是二进制数据,例如图像.音频文件.电子表格甚至二进制可执行代码.对象的大 ...