一个简洁的博客网站:http://lss-coding.top,欢迎大家来访
学习娱乐导航页:http://miss123.top/


一、认识 PageHelper

**官网:**https://pagehelper.github.io/

PageHelper 是 Mybatis 的一个插件,其作用是更加方便的进行分页查询。

在一个程序中难免会使用到查询操作,在查询操作中如果数据量太大则需要进行分页查询,分页操作的实现方法有很多,比如:在 mybatis 中 xml 文件中通过 limit 关键字进行分页查询,该插件就是为了简化在 xml 中进行分页操作的工具;好比在 Mybatis-Plus 中也对分页操作进行了封装,通过调用 selectPage() 方法就可以实现分页操作。

1. 在 sql 中使用 limit 进行分页查询

用法:LIMIT [offset,] rows

SELECT * FROM tb_user LIMIT 10, 10
  • offset 是相对于首行的偏移量(首行是 0),rows 是返回条数
  • mapper 中可以传变量,即在实际使用的时候 offset 与 rows 可以用变量替代

2. 使用第三方库进行分页查询

Mybatis 的 PageHelper 插件

好处在实际项目开发中更加的方便

在项目中我们执行一个分页查询时,很多时候还需要知道该查询的其他信息,比如:总数、每页数量、当前页数、是否有上一页或者是否有下一页等等,这些信息如果每次都自己写的话就会太繁琐冗余了,而 PageHelper 插件能够帮助我们更加方便地获取这些信息,大大方便了我们的开发效率。在 Mybatis-Plus 中也对分页查询进行封装,更加的灵活方便,可以参考:http://lss-coding.top/2021/08/05/mybatis-plus/

二、SpringBoot项目中使用

1. 构建一个 SpringBoot 项目

加入一下依赖

<!-- 日志打印,在控制台可以查看 sql 执行的语句 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.1</version>
</dependency>
<!-- pageHelper 插件 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version>
</dependency>
<!-- Mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version>
</dependency>
<!-- mysql 驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>
<!-- lombok 插件,生成 getter/setter 方法 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version><scope>provided</scope>
</dependency>

2. 配置拦截器插件

两种方式可以配置

2.1 通过 yml 配置文件进行配置
# PageHelper 分页插件配置
pagehelper:helper-dialect: mysqlreasonable: truesupport-methods-arguments: trueparams: count=countsql
  • helper-dialect:指定数据库,不指定的话会默认自动检测数据库类型
  • reasonable:是否启动分页合理化。如果启用,当 pagenum < 1 时,会自动查询第一页的数据,当 pagenum > pges 时,自动查询最后一页数据;不启用的,以上两种情况都会返回空数据,如果启用则 pageHelper可以自动拦截请求参数中的 pageNum,pageSize参数,否则需要使用 PageHelper.startPage(pageNum,pageSize) 方法调用。
  • support-methods-arguments:默认为 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
  • params:用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

pagehelper分页插件配置信息

#标识是哪一种数据库
pagehelper.helperDialect=mysql
#启用合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
pagehelper.reasonable=true
#为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
pagehelper.params=count=countSql
#支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页
pagehelper.supportMethodsArguments=true
#如果 pageSize=0 就会查询出全部的结果(相当于没有执行分页查询)
pagehelper.page-size-zero=true

2.2 配置类
@Configuration
public class PageHelperConfiguration {@Beanpublic PageHelper pageHelper() {PageHelper pageHelper = new PageHelper();Properties p = new Properties();p.setProperty("offsetAsPageNum", "true");p.setProperty("rowBoundsWithCount", "true");p.setProperty("reasonable", "true");pageHelper.setProperties(p);return pageHelper;}
}

3. 业务逻辑实现

分页查询 tb_user 表中的数据进行展示

  1. 创建一个 Mapper 接口
@Mapper
public interface UserMapper {List<User> getUserList();}
  1. 在 resources 文件夹下创建与之对应的 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lss.mapper.UserMapper"><select id="getUserList" resultType="User">SELECT * FROM tb_user</select></mapper>

这里需要注意:要在 application.yml 配置文件中进行配置

mybatis:# config-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mapper/*.xmlconfiguration:map-underscore-to-camel-case: true  # 也可以在 yml 配置文件中设置属性# 开启日志功能log-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-aliases-package: com.lss.domain
  1. 创建一个实现层接口
public interface UserService{List<User> getUserList();
}
  1. 创建实现层接口的实现类
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> getUserList() {// 设置第几条记录开始,多少页记录为一页PageHelper.startPage(1,5);// 获取 User,sql 语句为 select * from tb_user// 因为已经注册了 PageHelper插件,所以 PageHelper会在原 sql 语句上增加 limit,从而实现分页List<User> userList = userMapper.getUserList(); // 获得的分好页的结果集return userList;}
}

  1. 如果想要获取分页的详细信息,修改上面实现类代码
// 获取页面信息的对象,里面封装了很多的页面的信息:总条数、总页数、当前页数量、是否有上一页、是否有下一页等
PageInfo<User> userPageInfo = new PageInfo<>(userList);PageInfo{pageNum=1, pageSize=5, size=5, startRow=1, endRow=5, total=100, pages=20, list=Page{count=true, pageNum=1, pageSize=5, startRow=0, endRow=5, total=100, pages=20, reasonable=false, pageSizeZero=false}}

**注意:**只有紧跟着 PageHelper.startPage() 的那一句话起作用(原理可能是 PageHelper.startPage(pageNum,pageSize))在使用的时候启动了一个线程,致使了其能达到这个效果);

三、参数解析

4.1 PageHelper.startPage

方法调用

使用 PageHelper.startPage 静态方法调用 startPage:

特点:

  1. 静态方法,传递两个参数(当前页码,每页查询条数)

  2. 使用 pageHelper 分页的时候,不再关注分页语句,查询全部的语句

  3. 自动对 PageHelper.startPage 方法下的第一个 sql 查询进行分页 PageHelper.startPage(1,5);

    // 紧跟着的第一个 select 方法会被进行分页查询

也就是说在 Service 层 PageHelper.startPage(1,5);语句后一定是紧跟查询语句。

4.2 pageInfo

public class PageInfo<T> extends PageSerializable<T> {public static final int DEFAULT_NAVIGATE_PAGES = 8;// 当前页private int pageNum;// 每页的数量private int pageSize;// 当前页的数量private int size;// 下面两个不常用// 在页面中“显示 startRow” 到 endRow 共 size条数据// 当前页面中第一个元素的在数据库中的行号private long startRow;// 当前页面最后一个元素在数据库中的行号private long endRow;// 总页数private int pages;// 前一页private int prePage;// 下一页private int nextPage;// 是否为第一页private boolean isFirstPage;// 是否为最后一页private boolean isLastPage;// 是否有前一页private boolean hasPreviousPage;// 是否有下一页private boolean hasNextPage;// 导航页码数private int navigatePages;// 所有导航页号private int[] navigatepageNums;// 导航条上的第一页private int navigateFirstPage;// 导航条上的最后一页private int navigateLastPage;......
}

学习参考:

[CSDN] https://blog.csdn.net/qq_37699336/article/details/113795004

[CSDN] https://zhuanlan.zhihu.com/p/344982068

PageHelper 分页插件使用总结相关推荐

  1. spring boot整合mybatis+通用mapper+pagehelper分页插件

    spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...

  2. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我 ...

  3. SpringBoot中使用Mybatis-plus整合PageHelper分页插件踩坑

    今天使用SpringBoot中使用Mybatis-plus整PageHelper分页插件把我给坑惨了,我报错的pom.xml配置如下,其它的依赖就忽略掉了 <!--pagehelper --&g ...

  4. PageHelper 分页插件只用Page、不用PageInfo 的写法

    PageHelper 分页插件,学到的写法是得到Page 对象后再转成PageInfo 对象,但Page 是ArrayList 的子类,里面包含了数据列表和分页信息,为什么不能直接用Page 对象做分 ...

  5. springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zab635590867/article ...

  6. Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件

    前言 在 Springboot 系列文章第十一篇里(使用 Mybatis(自动生成插件) 访问数据库),实验了 Springboot 结合 Mybatis 以及 Mybatis-generator 生 ...

  7. 使用PageHelper分页插件手动分页,其他查询数据出现串连问题

    在一个需求中,需要在代码中进行分页,于是就选用了PageHelper分页插件进行分页,刚开始的时候忘记了PageHelper分页插件的用法于是我就用: // 设置分页查询条件 PageHelper.s ...

  8. 附加:PageHelper分页插件的:Page和PageInfo的区别;

    说明: (1)为什么写本篇博客?: ● 在[Spring Boot电商项目29:商品分类模块八:后台的[分类列表(平铺)]接口:]中,实现分页功能时,使用到了PageHelper分页插件: ● 但是, ...

  9. PageHelper分页插件及PageInfo介绍及使用

    1. MyBatis分页插件-PageHelper的配置 maven配置文件pom.xml 引入依赖: <!--引入PageHelper分页插件 → PageHelper--><de ...

最新文章

  1. Linux内核编译过程分析
  2. yolov3剪枝 SlimYOLOv3
  3. 百思不得其解,一个钻石玩家可以短时间上王者?因为猎游?
  4. canvas学习之API整理笔记(一)
  5. python 给word添加背景图片_Python如何使用word文档插入图片和表格
  6. 后宫宛如传服务器维护,合服丨《后宫宛如传》合服公告
  7. cf375D. Tree and Queries(莫队)
  8. java 静态 编译_Java中的动态和静态编译
  9. anaconda简单解决PackagesNotFoundError: The following packages are not available from current channels:
  10. 高效能管理之要事第一 时间管理表格2
  11. 浙江最新建筑施工特种工(施工升降机)机考真题及答案解析
  12. jd-gui - 打开jar出现中文乱码问题
  13. cad多段线画圆弧方向_cad弧形多线(cad多段线怎么画弧线)
  14. bzoj 3717 [PA2014]Pakowanie
  15. 如何通过Android日历api插入日程(事件)和提醒(通知)
  16. 微信圣诞头像来了,快给你的头像带上圣诞帽吧
  17. 手机怎么识别图中文字?这两个方法靠谱
  18. asin、acos、atan 和 atan2 函数用法简介
  19. 文娱干货丨如何体系化构建优质社区氛围?
  20. 鬼谷八荒仙姿男捏脸数据

热门文章

  1. AI 预测蛋白质结构「GitHub 热点速览 v.21.29」
  2. 带上这5款Android应用一起去旅行吧!
  3. Windows2008R2 打补丁后重启,系统无法正常启动
  4. m多载波MC-CDMA系统单用户检测方法的研究,对比EGC,MRC,ORC以及MMSE
  5. css 利用动画实现旋转卡片
  6. 如何用计算机绘制地层剖面图,采矿工程剖面图计算机生成方法探讨
  7. JavaEE 从入门到放弃(一):Java EE 是个什么东西
  8. Mac只能读取不能修改硬盘文件怎么办
  9. Mac OS 下三种修改Hosts文件的方法
  10. 京东云数据库 RDS助力企业便捷运维