Mybatis分页插件【PageHelper】

 

采取的环境:

idea版本:IntelliJ IDEA 2021.1.3 x64

Maven版本:apache-maven-3.6.3

Mybatis版本:mybatis-3.5.7

 一、分页是什么

例如:当我们在百度搜索时,页面最下方会出现这种导航栏:

2ba85584039e47cb8697d7fe25bad462.png

二、深度理解分页

        假设我们数据库中存储以下数据,我们用这些数据去做一个微头条的小型网站,这些数据有22条,我们不可能将所有的数据都展示在同一页,这样不仅增加服务器压力,也会使用户体验不好,这时就会用到分页。

7d7e2693ff944fb0a43c4b5aa32b0167.png

在对数据进行分页前,我们需要知道一些相关的数据

total:总数据量

pageSize:每页显示的数据量

pages:总页数【总页数=total/pageSize】

pageNum:当前页码

index:当前页第一条数据的起始行索引   【index=(pageNum-1)*pageSize】

其实,数据库中的limit语句就是分页,我们执行以下语句:

SELECT * FROM news_headline LIMIT 3,3;

得到的结果是:

4fafc3961a534b29bf78e7c6ad2ebebf.png 分析:

我们一共在数据库的news_headline表中存储了22条数据,那么total的值就是22,  执行了SELECT * FROM news_headline LIMIT 3,3,那么  pageSize的值就是3,也就是每页显示三条数据,pages的值就是22/3,由于除不尽,那么就会再多一页,也就是8页,由于每页显示3条数据,当前显示的数据是4,5,6,则pageNum的值为2,index的值为3(由于行索引是从0开始的,所以行索引3就表示的是第四条数据)。

三、pageHelper分页插件

当我们在网站开发时,如果还采用SQL语句的limit方法来分页,那么就显得比较麻烦了,这时我们可以采用pageHelper。

1、什么是pageHelper

PageHelper是一个MyBatis的分页插件。 它能让在MyBatis中进行数据库查询分页变得简单。你可以用它很方便地设置每页显示的数据条数和要查看的页码,快速得到分页后的结果,并且还能获取像总页数、总记录数这些分页信息。这样在开发网页应用展示列表数据(比如文章列表、商品列表)时,就能方便地实现分页功能。

2、pageHelper的优点

便捷性高:易于集成和配置,代码改动小就能实现分页功能。

功能多样:支持多种数据库,能灵活设置分页参数,还可获取丰富的分页信息。

性能良好:生成高效查询语句,减少数据传输和处理,对缓存友好。

四、如何使用pageHelper【在这里我们只讲解入门案例,目的是让大家先有所了解】

1、创建Maven工程

7029d8ddcbca42abb7140352f1ae5f7e.png

7ea8953957974d8ba36fb2d1f4109c39.png

2、添加pageHelper所需依赖

在这里采用的是Maven工程,在pom.xml直接引入以下依赖

如果版本不适配,大家可以去官网选择其他版本:  Maven依赖官方网址

<!--分页插件依赖-->
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.0</version>
</dependency>

611deffb52f148bcbb1158bc65773875.png

3、创建mybatis的核心配置文件mybatis-config.xml

011f5d6c7120430e99571ca417d9b670.png

注:记得将数据库配置改为自己数据库的用户名和密码

如果不想用引入jdbc配置文件的方式,则需要将 <properties resource="jdbc.properties"/>删除,并将下文出现的${jdbc. xxxx}的内容替换为相应的配置内容即可。

如果采用此配置方式,则需要创建jdbc.properties文件(一定记得修改为自己数据库的配置信息)

758d75411df4485fa081e6f2707e089d.png

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 引入jdbc配置文件 -->
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <package name=""/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!-- 在这里要加入自己映射文件所在的包路径  可以采用Mybatis逆向工程生成后再添加(Mybatis逆向工程见上篇文章) -->
        <package name=""/>
    </mappers>
</configuration>

4、在mybatis的核心配置文件中配置pagehelper分页插件

<plugins>
    <!--设置分页插件-->
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

19636be276b04bf2974bd003d079cc66.png

5、测试

测试时,我们需要在pom.xml文件中添加一些其他依赖

<!-- Mybatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

在数据库中创建emp表,添加一些简单数据

ae50a1209f2946dba21aca096d9e450f.png

采用Mybatis逆向工程生成(POJO实体类和mapper接口,以及映射文件,Mybatis逆向工程搭建见上篇文章)

package com.tsj.mybatis.test;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.tsj.mybatis.mapper.EmpMapper;
import com.tsj.mybatis.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class test {
    @Test
    public void testPageHelper() throws IOException {
        // 获取连接
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取sqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

        // 开启分页功能
        /**
         * 分页:
         * index: 当前页的起始索引: index=(pageNum-1)*pageSize
         * pageNum: 当前页的页码
         * pageSize: 每页数据的条数
         */
        // 采取分页,每页五条数据,查询第二页的数据
        Page<Object> pages = PageHelper.startPage(2, 5);
        // 根据条件查询数据(条件为null,那就是查询所有)
        List<Emp> emps = mapper.selectByExample(null);
        
        System.out.println("总数据量 :"+pages.getTotal());
        System.out.println("每页显示的数据量 :"+pages.getPageSize());
        System.out.println("当前页显示的数据集合 :"+pages.getResult());
        for (Emp emp : emps) {
            System.out.println(emp);
        }
    }
}

c063637539794ed58755aa63ee777297.png

获取详细的分页数据,封装成了PageInfo

package com.tsj.mybatis.test;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tsj.mybatis.mapper.EmpMapper;
import com.tsj.mybatis.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class test {
    @Test
    public void testPageHelper() throws IOException {
        // 获取连接
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取sqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);

        PageHelper.startPage(2, 3);
        List<Emp> empList = mapper.selectByExample(null);
        // 3: 设置导航栏页码数量为3   就是页面显示 1、2、3  设置的pageNum居中
        PageInfo<Emp> empPageInfo = new PageInfo<>(empList, 3);
        System.out.println(empPageInfo);
    }
}

c6d36459d845403b9a53fffc2ba8555d.png

pageInfo常用内容解释:

PageInfo{

pageNum=2:  当前前页码为第2页

pageSize=3:   每页有3条数据

size=3:            当前页显示的真实数据条数

total=12:           总数据条数12

pages=4:         总页数4

当前页显示的数据的集合:    

list=Page{count=true, pageNum=2, pageSize=3, startRow=3, endRow=6, total=12, pages=4, reasonable=false, pageSizeZero=false}[Emp(eid=5, empName=田七, age=22, sex=女, email=123@qq.com, did=2), Emp(eid=6, empName=马八, age=25, sex=男, email=123@qq.com, did=3), Emp(eid=9, empName=战术打法, age=23, sex=男, email=666@qq.com, did=2)],

prePage=1:       当前页的上一页页码

nextPage=3:        当前页的下一页页码

isFirstPage=false:  是否为第一页

isLastPage=false:   是否为最后一页

hasPreviousPage=true:     是否存在上一页

hasNextPage=true:       是否存在下一页

navigatePages=3:         导航分页的页码数,就是一个导航栏显示几个页码

navigateFirstPage=1:      导航栏显示的第一个页码

navigateLastPage=3:      导航栏现实的最后一个页码

navigatepageNums=[1, 2, 3]}:  导航分页的页码,就是显示在网页最下面的分页条(导航栏)

五、分页插件显示当前导航页页码的逻辑

1. 简单的固定页码显示逻辑

         最基础的一种是固定显示一定数量的页码。比如,一个分页插件可能固定显示5个页码。当你在第一页的时候,它会显示1、2、3、4、5这几个页码。这种逻辑很直接,就像是给你展示了一小段页码“数轴”,方便你快速跳转到相邻的几页。 假设你在第3页,那么它可能显示1、2、3、4、5页。它的核心思想是在当前页周围展示相邻的页码,这样用户不用频繁地翻页查找自己想要的内容。

2. 以当前页为中心的动态显示逻辑

        更常见的是一种以当前页为中心的逻辑。例如,分页插件会根据总页数和当前页的位置来调整显示的页码。如果总共有100页,当前页是40页。 它可能会显示38、39、40、41、42这几个页码。一般会保证当前页在中间位置(如果显示的页码数量是奇数个),或者尽量靠近中间(如果是偶数个页码显示)。这样的好处是,无论用户在第几页,都能方便地看到前后相邻的页码,而且重点突出了当前页的位置。

3. 临近边界的特殊显示逻辑

        当你接近第一页或者最后一页的时候,分页插件的页码显示逻辑会有所变化。比如,在第一页的时候,它可能不会显示前面的页码(因为已经是最开始了),而是显示1、2、3、4、5这样的页码(假设还是显示5个页码)。 当接近最后一页,例如总共有10页,当前页是9页,它可能显示7、8、9、10这几个页码。这样可以避免显示一些不存在的页码(比如在第一页时显示负数页码),同时也能让用户方便地跳转到最后几页或者最开始的几页。

 

 

 

 

 

 

 

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值