采取的环境:
idea版本:IntelliJ IDEA 2021.1.3 x64
Maven版本:apache-maven-3.6.3
Mybatis版本:mybatis-3.5.7
一、分页是什么
例如:当我们在百度搜索时,页面最下方会出现这种导航栏:

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

在对数据进行分页前,我们需要知道一些相关的数据
total:总数据量
pageSize:每页显示的数据量
pages:总页数【总页数=total/pageSize】
pageNum:当前页码
index:当前页第一条数据的起始行索引 【index=(pageNum-1)*pageSize】
其实,数据库中的limit语句就是分页,我们执行以下语句:
SELECT * FROM news_headline LIMIT 3,3;
得到的结果是:
分析:
我们一共在数据库的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工程


2、添加pageHelper所需依赖
在这里采用的是Maven工程,在pom.xml直接引入以下依赖
如果版本不适配,大家可以去官网选择其他版本: Maven依赖官方网址
<!--分页插件依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>

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

注:记得将数据库配置改为自己数据库的用户名和密码
如果不想用引入jdbc配置文件的方式,则需要将 <properties resource="jdbc.properties"/>删除,并将下文出现的${jdbc. xxxx}的内容替换为相应的配置内容即可。
如果采用此配置方式,则需要创建jdbc.properties文件(一定记得修改为自己数据库的配置信息)

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>

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表,添加一些简单数据

采用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);
}
}
}

获取详细的分页数据,封装成了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);
}
}

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这几个页码。这样可以避免显示一些不存在的页码(比如在第一页时显示负数页码),同时也能让用户方便地跳转到最后几页或者最开始的几页。
2229

被折叠的 条评论
为什么被折叠?



