本文共 2266 字,大约阅读时间需要 7 分钟。
在处理关系型数据库的 SQL 查询或数据导出时,面对大量数据,直接一次性查询或导出显然不可行。这种情况下,分页查询或导出成为了必然选择。然而,分页查询或导出的实现过程较为复杂,容易出错。因此,MyBatis-Plus 开发了 PageHelper 这个分页插件,用于简化数据库分页操作。
PageHelper 的核心原理是将传入的页码和条数赋值给一个 Page 对象,并将其保存到本地线程 ThreadLocal 中。随后,PageHelper 会进入 Mybatis 的拦截器环节,在拦截器中获取并处理刚才保存在 ThreadLocal 中的分页参数。这些分页参数会与原本的 SQL 语句和内部定义的 SQL 进行拼接,最终构建带有分页处理的 SQL 语句。
在项目的 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
以下是一个员工表的分页查询示例,展示了在 Controller、ServiceImpl 和 Mapper 层的具体实现:
@GetMapping("/page")public Result page(EmployeePageQueryDTO employeePageQueryDTO) { log.info("员工分页查询,参数为{}", employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult);} @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);} #####辅助类
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 的核心原理是通过 ThreadLocal 存储分页参数,并在 Mybatis 拦截器中处理这些参数,从而构建带有分页条件的 SQL 语句。具体来说,PageHelper 在处理 SQL 请求时,会先创建一个 PageHelper 拦截器,用于拦截所有需要分页的 SQL 请求。拦截器会检查当前线程是否已经存在 PageHelper 实例,如果不存在,则创建一个新的 PageHelper 实例,并将当前页码和条数存储到 ThreadLocal 中。
当 PageHelper 拦截到 SQL 请求时,会根据 ThreadLocal 中存储的分页参数,生成一个符合分页要求的 SQL 语句。这一过程包括以下几步:
这种方式可以在不修改原有业务逻辑的情况下,轻松实现分页功能,显著提升数据库查询和导出的效率。
转载地址:http://fjvfk.baihongyu.com/