详解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相关使用方法

  @Test
    public 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)。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/51214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中

文章目录 前言导入依赖库打开文件准备写入数据循环爬取多个页面完整代码运行效果结束语 前言 这篇文章介绍了如何使用 Python 爬虫技术获取代理IP并保存到文件中。通过使用第三方库 requests 发送HTTP请求&#xff0c;并使用 lxml 库解析HTML&#xff0c;我们可以从多个网页上…

《Kali渗透基础》11. 无线渗透(一)

kali渗透 1&#xff1a;无线技术特点2&#xff1a;IEEE 802.11 标准2.1&#xff1a;无线网络分层2.2&#xff1a;IEEE2.3&#xff1a;日常使用标准2.3.1&#xff1a;802.112.3.2&#xff1a;802.11b2.3.3&#xff1a;802.11a2.3.4&#xff1a;802.11g2.3.5&#xff1a;802.11n …

python的包管理器pip安装经常失败的解决办法:修改pip镜像源

pip 常用的国内镜像源&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/ // 清华 http://mirrors.aliyun.com/pypi/simple/ // 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ // 中国科技大学 http://pypi.hustunique.com/ // 华中理…

stm32通过ESP8266接入原子云

1. ESP8266模块需要烧录原子云固件&#xff0c;此原子云固件和正常的ESP8266固件相比添加了ATATKCLDSTA 和 ATATKCLDCLS 这两条指令&#xff1a; 2. 原子云账号注册及设备建立 设备管理-新增设备-ESP8266 新建设备后新建分组&#xff0c;将设备加入到此分组中&#xff1a; 至此…

【算法基础:贪心】6. 贪心

文章目录 区间问题905. 区间选点&#xff08;排序 贪心&#xff09;908. 最大不相交区间数量&#xff08;排序 贪心&#xff09;906. 区间分组&#xff08;排序 优先队列 贪心&#xff09;⭐907. 区间覆盖&#xff08;排序 贪心&#xff09; Huffman树148. 合并果子&#…

安卓:Picasso——加载网络图片的库

目录 一、Picasso介绍及其优势 二、Picasso的使用方法 1、添加依赖&#xff1a; 2、Picasso常用方法&#xff1a; 1、加载图像&#xff1a; 2、图像显示&#xff1a; 3、图像处理&#xff1a; 4、图像占位符和错误处理&#xff1a; 5、缓存控制&#xff1a; 6、清除缓…

关于前端框架vue2升级为vue3的相关说明

一些框架需要升级 当前&#xff08;202306&#xff09; Vue 的最新稳定版本是 v3.3.4。Vue 框架升级为最新的3.0版本&#xff0c;涉及的相关依赖变更有&#xff1a; 前提条件&#xff1a;已安装 16.0 或更高版本的Node.js&#xff08;摘&#xff09; 必须的变更&#xff1a;核…

06-MySQL-基础篇-SQL之DCL语句

SQL之DCL语句 前言DCL 管理用户查询用户创建用户修改用户密码删除用户说明 权限控制常见权限描述查询权限授予权限撤销权限说明 前言 本篇来学习下SQL中的DCL语句 DCL DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权…

附录1-将uni-app运行到微信开发者工具

目录 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 3 微信开发者工具的安全设置 4 运行 5 修改一些配置项 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 如果你忘了安装在哪里了&#xff0c;可以右键快捷方式看一下属性 在运行设置…

剑指offer42.连续子数组的最大和

这道题挺简单的&#xff0c;看完题脑子里出现的想法就是用一个sum来把数组从前往后加&#xff0c;如果sum小于0&#xff0c;那么对于和来说是会减小的&#xff0c;所以这个时候直接把sum归零&#xff0c;然后从这个位置再往后加&#xff0c;用一个max_sum来记录sum的最大值&…

SpringBoot整合ActiveMQ

ActiveMQ简单使用 JMS ActiveMQ 下载安装 https://activemq.apache.org/components/classic/download/解压缩文件。进入win64目录&#xff0c;双击运行activemq.bat文件&#xff0c;运行服务 将下面的网址输入到浏览器&#xff0c;用户名和密码都是admin SpringBoot整合Act…

MP的开发流程

MP的开发流程 1、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

LeetCode 1857. Largest Color Value in a Directed Graph【拓扑排序,动态规划】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

自动化运维工具—Ansible概述

Ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、…

linux | vscode | makefile | c++编译和调试

简单介绍环境&#xff1a; vscode 、centos、 gcc、g、makefile 简单来说就是&#xff0c;写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程&#xff0c;以及官网也看了很多次&#xff0c;最…

LabVIEW开发环境试验箱控制器

LabVIEW开发环境试验箱控制器 环境或气候试验箱是一种外壳&#xff0c;用于模拟各种材料&#xff08;包括工业产品、生物物质、复合材料、电子设备和航空航天部件&#xff09;的特定环境条件&#xff0c;并评估调节对这些材料的影响。 环境试验箱&#xff08;ETC&#xff09;…

短视频矩阵营销系统技术开发者开发笔记分享

一、开发短视频seo抖音矩阵系统需要遵循以下步骤&#xff1a; 1. 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 2. 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的…

PDF.js实现搜索关键词高亮显示效果

在static\PDF\web\viewer.js找到定义setInitialView方法 大约是在1202行&#xff0c;不同的pdf.js版本不同 在方法体最后面添加如下代码&#xff1a; // 高亮显示关键词---------------------------------------- var keyword new URL(decodeURIComponent(location)).searchP…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

【Linux】用户相关内容

如果命令ll 出现以上信息&#xff0c;UID为具体的数字&#xff0c;代表之前UID为502的用户被删除了。 更改目录或文件所属用户和所属组 在Linux中&#xff0c;创建一个文件时&#xff0c;该文件的拥有者都是创建该文件的用户。 更改所属用户 chown 用户名 文件名/目录名 更…