PageHelper 解析及实现原理
发布日期:2025-05-01 13:18:28 浏览次数:2 分类:技术文章

本文共 2845 字,大约阅读时间需要 9 分钟。

PageHelper 解析及实现原理

一、PageHelper介绍

面向关系型数据库的 SQL 查询和数据导出时,如果数据条数非常大,直接将所有数据一次性查出或者导出显然是不可行的。这时候就需要进行分页查询或分页导出,将查询或导出的数据按照指定大小分页加载或写入,从而提高查询或导出的效率。而分页查询或分页导出的实现过程比较繁琐,需要考虑很多细节问题,容易出错。因此,出现了一些支持分页查询或分页导出的插件或工具类,例如 MyBatis-Plus 的分页插件 PageHelper。

PageHelper是Mybatis-Plus中的一个插件,主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中。接下来,PageHelper会进入Mybatis的拦截器环节,在拦截器中获取并处理刚才保存在ThreadLocal中的分页参数。这些分页参数会与原本的SQL语句和内部已经定义好的SQL进行拼接,从而完成带有分页处理的SQL语句的构建。

二、PageHelper代码实现

1.导入插件

pom.xml中导入依赖

com.github.pagehelper
pagehelper-spring-boot-starter
1.3.0

在springboot配置文件(application.yml)中声明插件

#pagehelper分页插件配置pagehelper:  helperDialect: mysql  reasonable: true  supportMethodsArguments: true  params: count=countSql

2.业务代码

举例说明:有一个员工表,里面有数据若干,将员工数据全部查询并分页显示

Controller层代码(此处返回的是一个封装好的Result和PageResult类后续给出源码)

@GetMapping("/page")    @ApiOperation("员工分页查询")    public Result
page(EmployeePageQueryDTO employeePageQueryDTO){ log.info("员工分页查询,参数为{}",employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult); }

ServiceImpl:employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()分别是,要查询第几页、每页有几条数据

@Override    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {        //分页查询使用pagehelper插件,pom引入        //开始分页查询        PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());        Page
page = employeeMapper.pageQuery(employeePageQueryDTO); long total = page.getTotal(); List
records = page.getResult(); return new PageResult(total,records); }

Mapper层:

辅助理解的代码 Result类和PageResult类

public class PageResult implements Serializable {    private long total; //总记录数    private List records; //当前页数据集合}@Datapublic class Result
implements Serializable { private Integer code; //编码:1成功,0和其它数字为失败 private String msg; //错误信息 private T data; //数据 public static
Result
success() { Result
result = new Result
(); result.code = 1; return result; } public static
Result
success(T object) { Result
result = new Result
(); result.data = object; result.code = 1; return result; } public static
Result
error(String msg) { Result result = new Result(); result.msg = msg; result.code = 0; return result; }}

三、PageHelper实现原理

核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中。接下来,PageHelper会进入Mybatis的拦截器环节,在拦截器中获取并处理刚才保存在ThreadLocal中的分页参数。这些分页参数会与原本的SQL语句和内部已经定义好的SQL进行拼接,从而完成带有分页处理的SQL语句的构建。

在这里插入图片描述
在这里插入图片描述


如有问题,欢迎联系博主

上一篇:pageHelper分页工具的使用
下一篇:pageank

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月06日 17时10分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章