PageHelper 分页插件使用总结
一个简洁的博客网站: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 表中的数据进行展示
- 创建一个 Mapper 接口
@Mapper
public interface UserMapper {List<User> getUserList();}
- 在 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
- 创建一个实现层接口
public interface UserService{List<User> getUserList();
}
- 创建实现层接口的实现类
@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;}
}
- 如果想要获取分页的详细信息,修改上面实现类代码
// 获取页面信息的对象,里面封装了很多的页面的信息:总条数、总页数、当前页数量、是否有上一页、是否有下一页等
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:
特点:
静态方法,传递两个参数(当前页码,每页查询条数)
使用 pageHelper 分页的时候,不再关注分页语句,查询全部的语句
自动对 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 分页插件使用总结相关推荐
- spring boot整合mybatis+通用mapper+pagehelper分页插件
spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我 ...
- SpringBoot中使用Mybatis-plus整合PageHelper分页插件踩坑
今天使用SpringBoot中使用Mybatis-plus整PageHelper分页插件把我给坑惨了,我报错的pom.xml配置如下,其它的依赖就忽略掉了 <!--pagehelper --&g ...
- PageHelper 分页插件只用Page、不用PageInfo 的写法
PageHelper 分页插件,学到的写法是得到Page 对象后再转成PageInfo 对象,但Page 是ArrayList 的子类,里面包含了数据列表和分页信息,为什么不能直接用Page 对象做分 ...
- springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zab635590867/article ...
- Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件
前言 在 Springboot 系列文章第十一篇里(使用 Mybatis(自动生成插件) 访问数据库),实验了 Springboot 结合 Mybatis 以及 Mybatis-generator 生 ...
- 使用PageHelper分页插件手动分页,其他查询数据出现串连问题
在一个需求中,需要在代码中进行分页,于是就选用了PageHelper分页插件进行分页,刚开始的时候忘记了PageHelper分页插件的用法于是我就用: // 设置分页查询条件 PageHelper.s ...
- 附加:PageHelper分页插件的:Page和PageInfo的区别;
说明: (1)为什么写本篇博客?: ● 在[Spring Boot电商项目29:商品分类模块八:后台的[分类列表(平铺)]接口:]中,实现分页功能时,使用到了PageHelper分页插件: ● 但是, ...
- PageHelper分页插件及PageInfo介绍及使用
1. MyBatis分页插件-PageHelper的配置 maven配置文件pom.xml 引入依赖: <!--引入PageHelper分页插件 → PageHelper--><de ...
最新文章
- Linux内核编译过程分析
- yolov3剪枝 SlimYOLOv3
- 百思不得其解,一个钻石玩家可以短时间上王者?因为猎游?
- canvas学习之API整理笔记(一)
- python 给word添加背景图片_Python如何使用word文档插入图片和表格
- 后宫宛如传服务器维护,合服丨《后宫宛如传》合服公告
- cf375D. Tree and Queries(莫队)
- java 静态 编译_Java中的动态和静态编译
- anaconda简单解决PackagesNotFoundError: The following packages are not available from current channels:
- 高效能管理之要事第一 时间管理表格2
- 浙江最新建筑施工特种工(施工升降机)机考真题及答案解析
- jd-gui - 打开jar出现中文乱码问题
- cad多段线画圆弧方向_cad弧形多线(cad多段线怎么画弧线)
- bzoj 3717 [PA2014]Pakowanie
- 如何通过Android日历api插入日程(事件)和提醒(通知)
- 微信圣诞头像来了,快给你的头像带上圣诞帽吧
- 手机怎么识别图中文字?这两个方法靠谱
- asin、acos、atan 和 atan2 函数用法简介
- 文娱干货丨如何体系化构建优质社区氛围?
- 鬼谷八荒仙姿男捏脸数据