博客
关于我
PageHelper 解析及实现原理
阅读量:795 次
发布时间:2023-02-26

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

PageHelper 解析及实现原理

一、PageHelper 介绍

在处理关系型数据库的 SQL 查询或数据导出时,面对大量数据,直接一次性查询或导出显然不可行。这种情况下,分页查询或导出成为了必然选择。然而,分页查询或导出的实现过程较为复杂,容易出错。因此,MyBatis-Plus 开发了 PageHelper 这个分页插件,用于简化数据库分页操作。

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

二、PageHelper 代码实现

1. 导入插件

在项目的 pom.xml 文件中添加 PageHelper 的依赖:

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、ServiceImpl 和 Mapper 层的具体实现:

Controller 层
@GetMapping("/page")public Result
page(EmployeePageQueryDTO employeePageQueryDTO) { log.info("员工分页查询,参数为{}", employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult);}
ServiceImpl 层
@Overridepublic PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {    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 层

#####辅助类

public class PageResult implements Serializable {    private long total; // 总记录数    private List records; // 当前页数据集合}public class Result
implements Serializable { private Integer code; // 编码:1 成功,0 及其它为失败 private String msg; // 错误信息 private T data; // 数据}

三、PageHelper 实现原理

PageHelper 的核心原理是通过 ThreadLocal 存储分页参数,并在 Mybatis 拦截器中处理这些参数,从而构建带有分页条件的 SQL 语句。具体来说,PageHelper 在处理 SQL 请求时,会先创建一个 PageHelper 拦截器,用于拦截所有需要分页的 SQL 请求。拦截器会检查当前线程是否已经存在 PageHelper 实例,如果不存在,则创建一个新的 PageHelper 实例,并将当前页码和条数存储到 ThreadLocal 中。

当 PageHelper 拦截到 SQL 请求时,会根据 ThreadLocal 中存储的分页参数,生成一个符合分页要求的 SQL 语句。这一过程包括以下几步:

  • 获取当前页码和条数。
  • 将页码和条数注入到原有的 SQL 语句中。
  • 执行分页查询或导出。
  • 这种方式可以在不修改原有业务逻辑的情况下,轻松实现分页功能,显著提升数据库查询和导出的效率。

    转载地址:http://fjvfk.baihongyu.com/

    你可能感兴趣的文章
    OSPF 四种路由类型:Intra Area、Inter Area、第一、二类外部路由
    查看>>
    OSPF 学习
    查看>>
    OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
    查看>>
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>
    SQL Server 存储过程
    查看>>
    OSPF在什么情况下会进行Router ID的重新选取?
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>