详解Mybatis之分页插件【PageHelper】

news2024/9/22 21:20:36

编译软件: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)。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】Web学习笔记_flask(1)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

玩转LaTeX(四)【文献引入、自命令】

参考文献BibTeX: 使用最原始的文献导入&#xff1a;&#xff08;正文区&#xff09; \begin{document}%参考文献bibtex %一次管理一次使用 %参考文献格式&#xff1a; %\begin{thebibliography}{编号样本} % \bibitem[记号]{引用标志}文献条目1 % \b…

Java 程序员:本是为了跳槽刷完 1000 道真题,想不到被老板知道直接给我升职

同事&#xff1a;前阵子听说你要跳槽&#xff0c;现在准备得怎么样啊&#xff1f; 程序员 T&#xff1a;不跳了 同事&#xff1a;啊&#xff1f;为什么&#xff1f; 程序员 T&#xff1a;涨薪了呗&#xff1f; 同事&#xff1a;真的吗&#xff1f;涨了多少&#xff1f;你自…

IT类技术面试:从小白到高手的进阶指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

ElasticSearch基础篇-Java API操作

ElasticSearch基础-Java API操作 演示代码 创建连接 POM依赖 <?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:sch…

golang interface类型的nil

golang中interface变量&#xff0c;底层两个对象来存&#xff0c;一个是type、一个是value&#xff0c;只有type、value都为nil时&#xff0c;interface变量才是nil package mainimport ("fmt""reflect" )type People interface {Show() }type Student str…

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(4)

1003 Simple Set Problem 双指针的思想,双端队列 先从小到大排个序 一个一个放到双端队列里,一边放一边维护集合个数为k个 利用滑动窗口,当滑动窗口中集合个数为k时,只需算出滑动窗口最后一个数减去第一个数,然后每次取min就行了 AC代码&#xff1a; #include<iostream>…

电子元器件选型与实战应用—专栏介绍

文章目录 背景专栏内容专栏特色学习收获适用人群 背景 大家好&#xff0c;我是记得诚。 我新开了一个专栏&#xff0c;名字叫《电子元器件选型与实战应用》&#xff0c;选取20个最常用的电子元器件。 这是一个只讲如何选型&#xff0c;在实际电路中如何应用的专栏。 作为硬…

软考A计划-系统集成项目管理工程师-项目采购管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

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

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

flask 点赞系统

dianzan.html页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点赞系统</title> </head> <body><h2>这是一个点赞系统</h2><table border"1"><…

非线性优化的数值方法小结——梯度下降法,牛顿法,高斯牛顿法,LM法

非线性优化的数值方法小结——梯度下降法&#xff0c;牛顿法&#xff0c;高斯牛顿法&#xff0c;LM法 在非线性优化领域中&#xff0c;我们常采用一系列数值方法对构造的问题进行求解&#xff0c;各方法彼此联系&#xff0c;本文将对这些数值处理方法进行梳理构造。 问题描述…

Win系统如何下载安装使用cpolar内网穿透工具?

文章目录 概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpolar客户端2.1 下载并安装…

Vue.js 生命周期函数

系列文章目录 Vue.js基础简答题 文章目录 系列文章目录前言一、创建阶段1.beforeCreate2.created3.beforeMount4.mounted 二、运行阶段1.beforeUpdate2.updated 三、销毁阶段1.beforeDestroy2.destroyed 总结 前言 Vue.js 生命周期指的是Vue实例的生命周期&#xff1b; Vue实…

深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis

目录 一、Jedis 依赖 二、Java 客户端操控 redis 2.1、准备工作&#xff08;ssh 隧道&#xff09; 2.2、概要 2.2、string 2.3、hash 2.4、list 2.5、set 2.5、zset 一、Jedis 依赖 自己去 中央仓库 上面找. 二、Java 客户端操控 redis 2.1、准备工作&#xff08;ssh 隧…

数学建模学习(7):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

C++创建线程

前言 线程是轻量级的进程&#xff08;LWP&#xff1a;light weight process&#xff09;&#xff0c;在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合&#xff0c;指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位&#xff0c;分…

【点云处理教程】03使用 Python 实现地面检测

一、说明 这是我的“点云处理”教程的第3篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在上一教程中&#xff0c;我们在不使用 Open3D 库的情况下从深度数据计算点云。在本教程中&#xff0c;我们将首先…

H5打包封装小程序系统开发

H5打包封装小程序系统开发 H5打包封装小程序系统开发是指将H5页面打包封装成小程序的开发过程。下面是一个简单的步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;需要准备好H5页面的代码和资源文件。确保H5页面在浏览器中正常运行&#xff0c;并且没有依赖于浏览器特…

【LeetCode每日一题合集】2023.7.24-2023.7.30

文章目录 771. 宝石与石头代码1——暴力代码2——位运算集合⭐&#xff08;英文字母的long集合表示&#xff09; 2208. 将数组和减半的最少操作次数&#xff08;贪心 优先队列&#xff09;2569. 更新数组后处理求和查询⭐⭐⭐⭐⭐&#xff08;线段树&#xff09;TODO2500. 删除…