详解Mybatis之分页插件【PageHelper】
编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6
文章目录
- 一. 什么是分页?
- 二. 为什么使用分页?
- 三. 如何设计一个Page类(分页)?
- 四. PageHelper是什么?
- 五. 如何使用PageHelper?(入门案例)
- 六. 分页插件是根据什么样的页码逻辑去显示当前导航页的页码?

一. 什么是分页?
以百度搜索为例,如下所示

二. 为什么使用分页?
👉好处
- 可以提高用户体验度
- 可以降低服务器端压力
三. 如何设计一个Page类(分页)?
👉举例,例如 47/60
- 47:当前页码
- 60:总页数
👉Mysql中分页查询代码如下
#x:开启下标 y:每页显示数据数量
SELECT * FROM tbl_employee WHERE 1=1 LIMIT x,y
👉需要明确Page类的相关参数
pageNum:当前页码pages:总页数【计算:总页数=总数据数量/每页显示数据数量】total:总数据数量pageSize:每页显示数据数量List\<T>:当前页显示数据集合
四. PageHelper是什么?
👉概述
PageHelper是MyBatis中非常方便的第三方分页插件
👉官方参考文档
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md
五. 如何使用PageHelper?(入门案例)
👉步骤
- 导入PageHelperE的相关jar包
- 在mybatis-config.xml中配置分页插件
- 在查询之前,设置分页条件
- 在查询之后,将结果封装Pagelnfo中,使用Pagelnfo实现后续分页效果
👉用法案例
查询所有的员工信息,使用PageHelper插件进行分页显示,暂定分页效果为显示第二页,展示4条数据
示例代码如下:
①导入PageHelper的相关jar包
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.0.0</version>
</dependency>
②在mybatis-config.xml中配置分页插件
<!-- 配置分页插件 -->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
④在查询之前,设置分页条件
使用 PageHelper.startPage(2,4)并测试PageHelper相关使用方法
@Testpublic void test03(){try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过SqlSessionFactory对象调用openSession();SqlSession sqlSession = sqlSessionFactory.openSession();//获取EmployeeMapper的代理对象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);//在查询之前,设置分页条件//显示第一页,展示3条数据Page<Object> pages = PageHelper.startPage(2, 4);//员工的查询条件对象EmployeeExample ee=new EmployeeExample();//当员工的查询条件对象没有设任何属性值时,默认是查询所有的员工信息List<Employee> employees = employeeMapper.selectByExample(ee);for (Employee employee : employees) {System.out.println(employee);}//实现类似 "2/3"的效果(当前页码/数据的总页数)System.out.println(pages.getPageNum()+"/"+pages.getPages());System.out.println("总数据量 :"+pages.getTotal());System.out.println("每页显示的数据量 :"+pages.getPageSize());System.out.println("当前页显示的数据集合 :"+pages.getResult());for (Object page : pages.getResult()) {System.out.println(page);}} catch (IOException e) {e.printStackTrace();}}

⑤在查询之后,将结果封装Pagelnfo中,使用Pagelnfo实现后续分页效果
🤔为什么要使用Pagelnfo去封装分页的结果?
PageInfo就是用来封装分页信息的一个工具类,它能够将分页所需的所有信息组合在一起,并返回给前端或其他业务逻辑进行处理。
使用PageInfo去封装分页的结果可以带来以下好处:
- 方便管理分页相关的信息:PageInfo可以统一管理当前页码、每页记录数、总记录数、总页数等分页信息,使得代码更加清晰易读。
- 便于扩展和维护:当需求变化时,可以通过修改PageInfo类来快速实现新需求,而不需要对已有的代码进行大量修改,从而提高了系统的可维护性和扩展性。
- 更加灵活的分页展示效果:通过调整PageInfo中的参数设置,可以实现不同的分页展示效果,例如改变每页显示的记录数,调整页码的排列顺序等等。
@Test
public void test04(){try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//通过SqlSessionFactory对象调用openSession();SqlSession sqlSession = sqlSessionFactory.openSession();//获取EmployeeMapper的代理对象EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);//在查询之前,设置分页条件//显示第一页,展示3条数据Page<Object> pages = PageHelper.startPage(2, 4);//员工的查询条件对象EmployeeExample ee=new EmployeeExample();//当员工的查询条件对象没有设任何属性值时,默认是查询所有的员工信息List<Employee> employees = employeeMapper.selectByExample(ee);//查询之后,将结果封装Pagelnfo中,使用Pagelnfo实现后续分页效果PageInfo<Employee> pageInfo=new PageInfo<>(employees,5);//实现类似 "2/3"的效果(当前页码/数据的总页数)System.out.println(pageInfo.getPageNum()+"/"+pageInfo.getPages());//展示当前页面所有显示的数据for (Employee employee : pageInfo.getList()) {System.out.println(employee);}System.out.println("总数据量 :"+pageInfo.getTotal());System.out.println("是否有上一页:"+pageInfo.isHasPreviousPage());System.out.println("上一页是:"+pageInfo.getPrePage());System.out.println("是否有下一页:"+pageInfo.isHasNextPage());System.out.println("下一页是:"+pageInfo.getNextPage());System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());System.out.println("导航页的第一个页码是:"+pageInfo.getNavigateFirstPage());System.out.println("导航页的最后一个页码是:"+pageInfo.getNavigateLastPage());System.out.println("导航页的总页码是:"+pageInfo.getNavigatePages());} catch (IOException e) {e.printStackTrace();}
}

六. 分页插件是根据什么样的页码逻辑去显示当前导航页的页码?
🤔假设
设置导航页只显示5个页码,然表中共有65条数据,按照每页只能显示5条数据,那么总页数为13页
具体分页页码逻辑如下:
| 当前页码 | 导航页显示的页码范围 |
|---|---|
| 1 | 1,2,3,4,5 |
| 2 | 1,2,3,4,5 |
| 3 | 1,2,3,4,5 |
| 4 | 2,3,4,5,6 |
| 5 | 3,4,5,6,7 |
| 6 | 4,5,6,7,8 |
| … | … |
| 13 | 9,10,11,12,13 |
💡规律总结
为提高用户体验度,一般当前页码要满足【它要位于导航页显示的页码范围的中间】的布局条件。当前页码除(1,2,12,13)外,才适用以下规则生成相应的导航页。它+2与-2的两个页码值要分别成为导航页的第一个页码与最后一个页码,导航页要凑够5个页码,比如当前页码为3,那导航页显示的页码为(1,2,3,4,5),其他以此类推。当前页码要居于中间以满足布局要求。当前页码是逐步递增的,但它不能小于1(最小页码),不能大于13(最大页码),导航页显示的页码范围随着当前页码的变化而变化。
🤔为什么当前页码为(1,2,12,13)时,不适用上述生成规则生成导航页?
因为要想让它居于导航页的中间,它+2与-2的两个页码要么小于最小页码(1),要么大于最大页码(13),并且依据上述规则生成相应的导航页没有意义, 例如若它为1,则生成的导航页显示的是(-1,0,1,2,3),有意义吗?所以当当前页码为(1,2)时,相应导航页为(1,2,3,4,5),当前页码为(12,13),相应导航页为(9,10,11,12,13)。
相关文章:
详解Mybatis之分页插件【PageHelper】
编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 文章目录 一. 什么是分页?二. 为什么使用分页?三. 如何设计一个Page类(分…...
【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
基于jackson对bean的序列号和反序列化
通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致,这是怎么回事呢? 分页查询时服务端响应给页面的数据中id的值为19位数字,类型为long 页面中js处理long型数字只能精确到前16位,所以最终通过ajax请求提交给服务…...
排队理论简介
排队理论简介 1. 理论背景2. 研究的数学方法3. 拒绝型排队系统与等候型排队系统4. 拒绝型排队系统 本文参考文献为Вентцель Е. С.的《Исследование операций》。 1. 理论背景 排队理论又称大众服务理论,顾名思义指的是在有限的服务条…...
极速查找(3)-算法分析
篇前小言 本篇文章是对查找(2)的续讲二叉排序树 二叉排序树(Binary Search Tree,BST),又称为二叉查找树,是一种特殊的二叉树。性质: 左子树的节点值小于根节点的值,右…...
http 常见的响应状态码 ?
100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本200——交易成功201——提示知道新文件的URL202——接受和处理、但处理未完成203——返回信息不确定或不完整204——请求收到,但返回信息为空205——服务器完成了请求,用户代理…...
机器学习笔记之优化算法(四)线搜索方法(步长角度;非精确搜索)
机器学习笔记之优化算法——线搜索方法[步长角度,非精确搜索] 引言回顾:精确搜索步长及其弊端非精确搜索近似求解最优步长的条件反例论述 引言 上一节介绍了从精确搜索的步长角度观察了线搜索方法,本节将从非精确搜索的步长角度重新观察线搜…...
Redis 哨兵 (sentinel)
是什么 官网理论:https://redis.io/docs/management/sentinel/ 吹哨人巡查监控后台 master 主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务。 作用:无人值守运维 哨兵的作用: 1…...
统计2021年10月每个退货率不大于0.5的商品各项指标
统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网s mysql(ifnull): select product_id, format(ifnull(sum(if_click)/nullif(count(*),0),0),3) as ctr, format(ifnull(sum(if_cart)/nullif(sum(if_click),0),0),3) as c…...
【小波尺度谱】从分段离散小波变换计算小波尺度谱研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
UE5、CesiumForUnreal加载无高度地形
文章目录 1.实现目标2.实现过程3.参考资料1.实现目标 在UE5中,CesiumForUnreal插件默认的地形都是带高度的,这里加载没有高度的地形,即大地高程为0,GIF动图如下: 2.实现过程 参考官方的教程,下载无高度的DEM,再切片加载到UE中。 (1)下载无高度地形DEM0。 在官方帖子…...
关于Spring中的@Configuration中的proxyBeanMethods属性
Configuration的proxyBeanMethods属性 在Configuration注解中,有两个属性: value配置Bean名称proxyBeanMethos,默认是true 这个proxyBeanMethods的默认属性是true。 直接说:当Configuration注解的proxyBeanMeathods属性是true…...
dp1,ACM暑期培训
D - 摆花 P1077 [NOIP2012 普及组] 摆花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花&…...
大厂程序员的水平比非大厂高很多嘛?
最近一个月,筛选了一百多份简历,前前后后面试了二三十人,基本上都是有大厂经历的人。同时,也录用了几个有大厂经历的。但整体而言,打破了对大厂出来的都是优质人才的幻觉。看到的实际情况与想象中的落差还是比较大的。…...
Java开发工具MyEclipse发布v2023.1.2,今年第二个修复版!
MyEclipse一次性提供了巨量的Eclipse插件库,无需学习任何新的开发语言和工具,便可在一体化的IDE下进行Java EE、Web和PhoneGap移动应用的开发;强大的智能代码补齐功能,让企业开发化繁为简。 MyEclipse v2023.1.2官方正式版下载 …...
基于正交滤波器组的语音DPCM编解码算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................................g0zeros(1,lenH); g1zeros(1,l…...
VS2022和QT混合编程打包发布程序
1.在开始菜单输入 CMD 找到 Qt5.15.2(MSVC 64-bit) 2.输入windeployqt exe所在路径 3.运行完毕后,双击打开exe文件,可能会报错,缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。...
Filebeat学习笔记
Filebeat基本概念 简介 Filebeat是一种轻量级日志采集器,内置有多种模块(auditd、Apache、Nginx、System、MySQL等),针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点&#…...
【实战】 九、深入React 状态管理与Redux机制(一) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十六)
文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...
第九十五回 如何使用dio的转换器
文章目录 概念介绍使用方法使用默认的转换器自定义转换器 示例代码经验分享 我们在上一章回中介绍了"如何打造一个网络框架"相关的内容,本章回中将介绍 如何使用dio的转换器.闲话休提,让我们一起Talk Flutter吧。 概念介绍 转换器主要用来转…...
Unity Android读取SD卡图片的5种实战方案与选型指南
1. 为什么在 Unity Android 上“读取 sdcard 图片”会让人反复踩坑? “Unity Android 读取 sdcard 路径下指定文件夹的所有图片”——这句话看似平平无奇,但凡是真正在项目里做过相册预览、本地图库导入、离线资源加载、用户截图归档这类功能的开发者&am…...
高熵合金熔化温度计算:EAM+MTP+FEP混合框架实现高精度低成本预测
1. 项目概述:为什么高熵合金的熔化温度计算是个“硬骨头”?在材料研发的前沿,高熵合金(HEAs)以其独特的“鸡尾酒效应”和优异的力学性能、耐腐蚀性及高温稳定性,吸引了无数研究者的目光。然而,当…...
MoE-GPS框架:动态专家复制的负载均衡优化策略
1. MoE-GPS框架解析:动态专家复制的预测策略指南在大型语言模型(LLM)的实际部署中,混合专家(Mixture-of-Experts, MoE)架构通过动态激活专家子集显著降低了计算开销。然而,多GPU环境下的专家负载…...
我的crontab脚本总是不执行?一份超全的Linux定时任务排错自查清单
我的crontab脚本总是不执行?一份超全的Linux定时任务排错自查清单 当你深夜收到服务器告警,发现关键备份任务没有按时执行时,那种头皮发麻的感觉每个运维人员都懂。crontab作为Linux系统最常用的定时任务工具,看似简单的配置背后…...
告别VMware网络冲突!CentOS Stream 9虚拟机静态IP配置保姆级避坑指南
CentOS Stream 9虚拟机静态IP配置终极排错手册当你在VMware中为CentOS Stream 9配置静态IP时,是否遇到过这些诡异现象:ip addr显示两个IP地址、网络时断时续、ping外网时通时不通?这背后隐藏着DHCP与静态IP的"权力斗争"。本文将带你…...
机器人导航核心技术:深度感知与传感器融合的工程实践
1. 项目概述:从“看见”到“理解”的机器人导航革命在机器人技术领域,导航能力是其智能化的核心体现。传统的机器人导航,无论是依赖预设地图的循迹,还是基于简单激光雷达的避障,都像是蒙着眼睛在熟悉的房间里摸索——虽…...
视频融合与空间计算先行者
视频融合与空间计算先行者 镜像视界(浙江)科技有限公司,以SpaceOS™空间操作系统为底座,开创“像素即坐标”的技术范式,是视频融合与空间计算领域的先行者 。 技术创新:全栈自研,定义行业标杆…...
如何用OpenSpeedy实现单机游戏5倍速运行:完整免费加速教程
如何用OpenSpeedy实现单机游戏5倍速运行:完整免费加速教程 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 还在为游戏卡顿和漫长的等待时间烦恼吗?Ope…...
【Python趣味编程】用 Tkinter 打造“爱心便签墙”:一份来自代码的温柔
【Python趣味编程】用 Tkinter 打造“爱心便签墙”:一份来自代码的温柔 文章目录【Python趣味编程】用 Tkinter 打造“爱心便签墙”:一份来自代码的温柔🎯 前言🧠 核心思路关键点:💻 完整代码🔧…...
计算机视觉与贝叶斯优化驱动的粉末饮料智能制备系统
1. 项目概述:从“冲一杯”到“冲好一杯”的自动化跃迁“机器人结合计算机视觉与贝叶斯优化实现粉末饮料制备自动化”,这个标题听起来有点学术,但说白了,我们做的就是把冲奶粉、泡蛋白粉、调咖啡这类“凭感觉”的手工活,…...
