当前位置: 首页 > news >正文

详解Mybatis之分页插件【PageHelper】

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6


文章目录

  • 一. 什么是分页?
  • 二. 为什么使用分页?
  • 三. 如何设计一个Page类(分页)?
  • 四. PageHelper是什么?
  • 五. 如何使用PageHelper?(入门案例)
  • 六. 分页插件是根据什么样的页码逻辑去显示当前导航页的页码?


在这里插入图片描述


一. 什么是分页?

以百度搜索为例,如下所示

在这里插入图片描述


二. 为什么使用分页?

👉好处

  1. 可以提高用户体验度
  2. 可以降低服务器端压力

三. 如何设计一个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?(入门案例)

👉步骤

  1. 导入PageHelperE的相关jar包
  2. 在mybatis-config.xml中配置分页插件
  3. 在查询之前,设置分页条件
  4. 在查询之后,将结果封装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去封装分页的结果可以带来以下好处:

  1. 方便管理分页相关的信息:PageInfo可以统一管理当前页码、每页记录数、总记录数、总页数等分页信息,使得代码更加清晰易读。
  2. 便于扩展和维护:当需求变化时,可以通过修改PageInfo类来快速实现新需求,而不需要对已有的代码进行大量修改,从而提高了系统的可维护性和扩展性。
  3. 更加灵活的分页展示效果:通过调整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页

具体分页页码逻辑如下:

当前页码导航页显示的页码范围
11,2,3,4,5
21,2,3,4,5
31,2,3,4,5
42,3,4,5,6
53,4,5,6,7
64,5,6,7,8
139,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】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一. 什么是分页&#xff1f;二. 为什么使用分页&#xff1f;三. 如何设计一个Page类&#xff08;分…...

【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

基于jackson对bean的序列号和反序列化

通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致&#xff0c;这是怎么回事呢? 分页查询时服务端响应给页面的数据中id的值为19位数字&#xff0c;类型为long 页面中js处理long型数字只能精确到前16位&#xff0c;所以最终通过ajax请求提交给服务…...

排队理论简介

排队理论简介 1. 理论背景2. 研究的数学方法3. 拒绝型排队系统与等候型排队系统4. 拒绝型排队系统 本文参考文献为Вентцель Е. С.的《Исследование операций》。 1. 理论背景 排队理论又称大众服务理论&#xff0c;顾名思义指的是在有限的服务条…...

极速查找(3)-算法分析

篇前小言 本篇文章是对查找&#xff08;2&#xff09;的续讲二叉排序树 二叉排序树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;&#xff0c;又称为二叉查找树&#xff0c;是一种特殊的二叉树。性质&#xff1a; 左子树的节点值小于根节点的值&#xff0c;右…...

http 常见的响应状态码 ?

100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本200——交易成功201——提示知道新文件的URL202——接受和处理、但处理未完成203——返回信息不确定或不完整204——请求收到&#xff0c;但返回信息为空205——服务器完成了请求&#xff0c;用户代理…...

机器学习笔记之优化算法(四)线搜索方法(步长角度;非精确搜索)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索] 引言回顾&#xff1a;精确搜索步长及其弊端非精确搜索近似求解最优步长的条件反例论述 引言 上一节介绍了从精确搜索的步长角度观察了线搜索方法&#xff0c;本节将从非精确搜索的步长角度重新观察线搜…...

Redis 哨兵 (sentinel)

是什么 官网理论&#xff1a;https://redis.io/docs/management/sentinel/ 吹哨人巡查监控后台 master 主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务。 作用&#xff1a;无人值守运维 哨兵的作用&#xff1a; 1…...

统计2021年10月每个退货率不大于0.5的商品各项指标

统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网s mysql&#xff08;ifnull&#xff09;&#xff1a; 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代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

UE5、CesiumForUnreal加载无高度地形

文章目录 1.实现目标2.实现过程3.参考资料1.实现目标 在UE5中,CesiumForUnreal插件默认的地形都是带高度的,这里加载没有高度的地形,即大地高程为0,GIF动图如下: 2.实现过程 参考官方的教程,下载无高度的DEM,再切片加载到UE中。 (1)下载无高度地形DEM0。 在官方帖子…...

关于Spring中的@Configuration中的proxyBeanMethods属性

Configuration的proxyBeanMethods属性 在Configuration注解中&#xff0c;有两个属性&#xff1a; value配置Bean名称proxyBeanMethos&#xff0c;默认是true 这个proxyBeanMethods的默认属性是true。 直接说&#xff1a;当Configuration注解的proxyBeanMeathods属性是true…...

dp1,ACM暑期培训

D - 摆花 P1077 [NOIP2012 普及组] 摆花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Description 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n 种花&…...

大厂程序员的水平比非大厂高很多嘛?

最近一个月&#xff0c;筛选了一百多份简历&#xff0c;前前后后面试了二三十人&#xff0c;基本上都是有大厂经历的人。同时&#xff0c;也录用了几个有大厂经历的。但整体而言&#xff0c;打破了对大厂出来的都是优质人才的幻觉。看到的实际情况与想象中的落差还是比较大的。…...

Java开发工具MyEclipse发布v2023.1.2,今年第二个修复版!

MyEclipse一次性提供了巨量的Eclipse插件库&#xff0c;无需学习任何新的开发语言和工具&#xff0c;便可在一体化的IDE下进行Java EE、Web和PhoneGap移动应用的开发&#xff1b;强大的智能代码补齐功能&#xff0c;让企业开发化繁为简。 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.运行完毕后&#xff0c;双击打开exe文件&#xff0c;可能会报错&#xff0c;缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。...

Filebeat学习笔记

Filebeat基本概念 简介 Filebeat是一种轻量级日志采集器&#xff0c;内置有多种模块&#xff08;auditd、Apache、Nginx、System、MySQL等&#xff09;&#xff0c;针对常见格式的日志大大简化收集、解析和可视化过程&#xff0c;只需一条命令即可。之所以能实现这一点&#…...

【实战】 九、深入React 状态管理与Redux机制(一) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十六)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

第九十五回 如何使用dio的转换器

文章目录 概念介绍使用方法使用默认的转换器自定义转换器 示例代码经验分享 我们在上一章回中介绍了"如何打造一个网络框架"相关的内容&#xff0c;本章回中将介绍 如何使用dio的转换器.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 转换器主要用来转…...

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xff0c;取…...

RAID相关知识

简介 RAID &#xff08; Redundant Array of Independent Disks &#xff09;即独立磁盘冗余阵列&#xff0c;通常简称为磁盘阵列。RAID技术将多个单独的物理硬盘以不同的方式组合成一个逻辑磁盘&#xff0c;从而提高硬盘的读写性能和数据安全性。 数据组织形式 分块&#x…...

DataStructure--Basic

程序设计数据结构算法 只谈数据结构不谈算法就跟去话剧院看梁山伯与祝英台结果只有梁山伯在演&#xff0c;祝英台生病了没来一样。 本文的所有内容都出自《大话数据结构》这本书中的代码实现部分&#xff0c;建议看书&#xff0c;书中比我本文写的全。 数据结构&#xff0c;直…...

Intellij IDEA 双击启动报错ClassNotFoundException: com.licel.b.z@

项目场景&#xff1a; 新从官网下载了ideaIU-2023.2.win.zip &#xff0c;安装后双击启动报错&#xff0c; 无法运行idea, 提示信息如下 问题描述 Internal error. Please refer to https://jb.gg/ide/critical-startup-errorsjava.lang.ExceptionInInitializerErrorat java…...

使用 Logstash 及 enrich processor 实现数据丰富自动化

在我之前的文章&#xff1a; Elasticsearch&#xff1a;enrich processor &#xff08;7.5发行版新功能&#xff09; Elasticsearch&#xff1a;使用 Elasticsearch ingest pipeline 丰富数据 通过上面的两篇文章的介绍&#xff0c;我们应该充分掌握了如何使用 enrich proce…...

Django模板语法和请求

1、在django关于模板文件加载顺序 创建的django项目下会有一个seeetings.py的文件 如果在seeetings.py 中加了 os.path.join(BASE_DIR,‘templates’)&#xff0c;如果是pycharm创建的django项目会加上&#xff0c;就会默认先去根目录找templates目录下的html文件&#xff0c…...

Android跨进程传大图思考及实现——附上原理分析

1.抛一个问题 这一天&#xff0c;法海想锻炼小青的定力&#xff0c;由于Bitmap也是一个Parcelable类型的数据&#xff0c;法海想通过Intent给小青传个特别大的图片 intent.putExtra("myBitmap",fhBitmap)如果“法海”(Activity)使用Intent去传递一个大的Bitmap给“…...

【动态规划part13】| 300.最长递增子序列、674.最长连续递增序列、718.最长重复数组

目录 &#x1f388;LeetCode 300.最长递增子序列 &#x1f388;LeetCode 674. 最长连续递增序列 &#x1f388;LeetCode 718. 最长重复子数组 &#x1f388;LeetCode 300.最长递增子序列 链接&#xff1a;300.最长递增子序列 给你一个整数数组 nums &#xff0c;找到其…...

QMainWindow

文章目录 QMainWindow基本元素QMainWindow函数介绍简单的示例效果图 QMainWindow QMainWindow是一个为用户提供主窗口程序 的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、―个 状态栏(status bar )及一个中心部件(central …...

PV操作解决经典进程同步问题

一.经典同步问题 在学习《操作系统》时&#xff0c;会接触到进程的概念&#xff0c;其中不可避免的接触到进程同步问题&#xff0c;今天我们用熟悉的PV操作解决一些经典的进程同步问题。 二.生产者-消费者问题 1.问题描述 问题描述&#xff1a;一组生产者进程和一组消费者进…...

wordpress给外部链接加上跳转/seo综合查询工具

今天在java爬取天猫的时候因为ssl报错&#xff0c;所以从网上找了一个可以爬取https和http通用的工具类。但是有的时候此工具类爬到的数据不全&#xff0c;此处不得不说python爬虫很厉害。 package cn.qlq.craw.Jsoup;import java.io.File; import java.io.FileWriter; import …...

网络诚信 网站应怎么做/项目网站

阅读目录阐述桥接模式与nat模式centos7 配置域名阐述 桥接模式与nat模式 centos7 配置域名 [rootbogon laravel5]# vi /etc/resolv.conf 127.0.0.1 test.com ping 域名即可ping通 ping test.com...

织梦cms网站迁移/宁波关键词优化时间

huffle过程&#xff1a;由ShuffleManager负责&#xff0c;计算引擎HashShuffleManager&#xff08;Spark 1.2&#xff09;—>SortShuffleManager spark根据shuffle类算子进行stage的划分&#xff0c;当执行某个shuffle类算子&#xff08;reduceByKey、join&#xff09;时&a…...

佛山外贸网站建设价位/珠海百度搜索排名优化

不管是在APP还是PC&#xff0c;不管是Loading页&#xff0c;还是在音乐播放器中&#xff0c;进度条的运用都非常广泛&#xff0c;形式也多种多样&#xff0c;让人眼花缭乱。做为一个交互设计新手&#xff0c;项目中也经常碰到进度条设计&#xff0c;总有很多疑惑在心中挥之不去…...

小韩网站源码/什么是seo

愤怒的调音师《调音台不思议手记》 http://blog.sina.com.cn/s/articlelist_1864015100_0_1.html 一、调音台、Gian&#xff08;增益&#xff09;、CLIP(peak)&#xff08;削波&#xff09; 调音台分区&#xff1a;输入通道区&#xff0c;功能区&#xff0c;输出母线区 PE…...

wordpress淘宝客主题带条件筛选/在哪个平台做推广比较好

作为一个菜鸟的我&#xff0c;经过了两天的不懈努力&#xff0c;终于成功编译了xen4.1.1和以linux3.0内核为domain0的xen平台&#xff0c;呼呼~~不断失败后的成功就是爽了&#xff01; 经验之谈&#xff1a;安装之前读一下readme&#xff0c;并且在毫无了解xen之前先了解一下xe…...