博客
关于我
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/

    你可能感兴趣的文章
    Oracle 11g数据库安装和卸载教程
    查看>>
    Oracle 11g超详细安装步骤
    查看>>
    Oracle BEQ方式连接配置
    查看>>
    ORACLE Bug 4431215 引发的血案—原因分析篇
    查看>>
    oracle dblink 创建使用 垮库转移数据
    查看>>
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    查看>>
    Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
    查看>>
    oracle dg switchover,DG Switchover fails
    查看>>
    Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
    查看>>
    Oracle EBS环境下查找数据源(OAF篇)
    查看>>
    oracle Extract 函数
    查看>>
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    oracle ogg 单实例双向复制搭建(oracle-oracle)--Oracle GoldenGate
    查看>>
    oracle scott趣事
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial GeoRaster 金字塔栅格存储
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>