一、PageHelper 概述
- PageHelper 是一个优秀的 MyBatis 分页插件,可以方便地在 Spring Boot 项目中使用 MyBatis 结合 PageHelper 实现分页功能
二、PageHelper 引入
1、依赖引入
- pom.xml
<properties>...<postgresql.verison>42.5.6</postgresql.verison><mybatis.version>3.0.1</mybatis.version><pagehelper.version>1.4.3</pagehelper.version>
</properties>
<dependencies>...<!-- postgresql 驱动 --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${postgresql.verison}</version></dependency><!-- mybatis 和 springboot 整合的起步依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><!-- 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.version}</version></dependency>
</dependencies>
2、配置文件
- application.yml
mybatis:mapper-locations: classpath:/mapper/*.xml # 映射文件路径config-location: classpath:/mybatis-config.xml # 核心配置文件路径
- mybatis-config.xml
<?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><settings><!-- 设置驼峰标识 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 打印 SQL 语句 --><setting name="logImpl" value="STDOUT_LOGGING"/></settings><plugins><!-- 分页插件 --><plugin interceptor="com.github.pagehelper.PageInterceptor"/></plugins>
</configuration>
3、准备数据
- 创建数据表
CREATE TABLE staff (id SERIAL PRIMARY KEY,name VARCHAR(255) NOT NULL,role VARCHAR(255),salary DECIMAL(10, 2)
);
- 插入数据
INSERT INTO staff (name, role, salary) VALUES
('张三', '项目经理', 25000.00),
('李四', '高级开发工程师', 18000.00),
('王五', '开发工程师', 15000.00),
('赵六', '测试工程师', 12000.00),
('钱七', 'UI设计师', 13000.00),
('孙八', '产品经理', 20000.00),
('周九', '运维工程师', 14000.00),
('吴十', '初级开发工程师', 10000.00),
('郑十一', '数据库管理员', 16000.00),
('王十二', '技术总监', 30000.00);
三、PageHelper 初识
1、基本介绍
- startPage 方法用于设置分页参数,紧跟的第一个查询方法会被分页
static <E> Page<E> startPage(int pageNum, int pageSize)
参数 | 说明 |
---|---|
pageNum | 当前页码 |
pageSize | 每页条数 |
2、具体实现
(1)Entity
- Staff.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Staff {private Integer id;private String name;private String role;private Double salary;
}
(2)Mapper
- StaffMapper.java
@Mapper
public interface StaffMapper {List<Staff> queryAll();
}
- StaffMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.my.mapper.StaffMapper"><resultMap id="staffResultMap" type="com.my.model.db.Staff"><id column="id" property="id"/><result column="name" property="name"/><result column="role" property="role"/><result column="salary" property="salary"/></resultMap><select id="queryAll" resultMap="staffResultMap">SELECT *FROM staff</select>
</mapper>
(3)Test
// 设置分页参数
PageHelper.startPage(1, 5);// 紧跟的第一个查询方法会被分页
List<Staff> staffs = staffMapper.queryAll();for (Staff staff : staffs) {System.out.println(staff);
}
# 输出结果Staff(id=3, name=张三, role=项目经理, salary=25000.0)
Staff(id=4, name=李四, role=高级开发工程师, salary=18000.0)
Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
Staff(id=7, name=钱七, role=UI设计师, salary=13000.0)
四、PageInfo 分页信息
1、基本介绍
-
PageHelper 提供了 PageInfo 类,用于封装分页信息
-
分页信息包括当前页码、每页条数、总页数、总记录数、是否为第一页、是否为最后一页等
2、演示
// 设置分页参数
PageHelper.startPage(1, 5);// 紧跟的第一个查询方法会被分页
List<Staff> staffs = staffMapper.queryAll();// 包装分页信息
PageInfo<Staff> pageInfo = new PageInfo<>(staffs);for (Staff staff : staffs) {System.out.println(staff);
}int pageNum = pageInfo.getPageNum();
int pageSize = pageInfo.getPageSize();
int pageTotal = pageInfo.getPages();
long total = pageInfo.getTotal();
boolean isFirstPage = pageInfo.isIsFirstPage();
boolean isLastPage = pageInfo.isIsLastPage();System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
System.out.println("isFirstPage: " + isFirstPage);
System.out.println("isLastPage: " + isLastPage);
# 输出结果Staff(id=3, name=张三, role=项目经理, salary=25000.0)
Staff(id=4, name=李四, role=高级开发工程师, salary=18000.0)
Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
Staff(id=7, name=钱七, role=UI设计师, salary=13000.0)
pageNum: 1
pageSize: 5
pageTotal: 2
total: 10
isFirstPage: true
isLastPage: false
五、Page 类
1、基本介绍
-
可以使用 Page 类来接收结果
-
Page 对象本身就包含了分页信息,不需要额外包装成 PageInfo 对象
2、演示
(1)Mapper
- StaffMapper.java
Page<Staff> queryAll2();
- StaffMapper.xml
<select id="queryAll2" resultMap="staffResultMap">SELECT *FROM staff
</select>
(2)Test
PageHelper.startPage(1, 5);Page<Staff> page = staffMapper.queryAll2();for (Staff staff : page) {System.out.println(staff);
}int pageNum = page.getPageNum();
int pageSize = page.getPageSize();
int pageTotal = page.getPages();
long total = page.getTotal();System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
# 输出结果Staff(id=3, name=张三, role=项目经理, salary=25000.0)
Staff(id=4, name=李四, role=高级开发工程师, salary=18000.0)
Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
Staff(id=7, name=钱七, role=UI设计师, salary=13000.0)
pageNum: 1
pageSize: 5
pageTotal: 2
total: 10