​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。
🦅主页:@逐梦苍穹
📕项目专栏:您的一键三连,是我创作的最大动力🌹

1、简介

PageHelper是Mybatis提供的分页插件。

官网:https://pagehelper.github.io/

如果不使用PageHelper分页插件,则开发者需要:

(1)使用MySQL中的limit实现查询第几页的时候,需要计算查询第几个到第几个。这步容易算错;
(2)需要计算总记录数,这需要额外的创建一个SQL语句来获取记录总数;
(3)得到总数后,需要根据每页显示几条数据,来计算总页数,当前页是哪一页,上一页是哪一页,下一页是哪一页……这些信息都获取后,才能在前台展现;

使用PageHelper分页插件则没有这些问题。

2、使用

这里以黑马苍穹外卖项目(SpringBoot项目)中的员工分页查询为例

2.1、导入

2.1.1、SpringBoot

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper-spring-boot-starter</artifactId>
  <version>1.3.0</version>
</dependency>

配置 application.yml(可以不配)

# 分页配置
pagehelper:
  helper-dialect: mysql	#使用的数据库. mysql, oracle, sqlite
  reasonable: true #开启优化,在分页页码结果没有数据的时候,会显示有数据的页码数据,也就是当当前页<1时,返回第 1 页, 当当前页 > 最大页时, 返回最后一页的数据.
  support-methods-arguments: true #是否支持接口参数来传递分页参数,默认false
  pageSizeZero: false #表示当 pageSize=0 时返回所有
  params: count=countSql

2.1.2、非SpringBoot

①引入依赖

<!-- pageHelper 分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.0.0</version>
</dependency>

②插件设置
XML 方式 : MyBatis.xml

<configuration>
    ...
    <!-- 使用插件 -->
    <plugins>
        <!-- 使用分页插件 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 分页参数合理化, 当页码数 < 0 时, 显示第一页.   当页码数 > 总页码数时, 显示最后一页  -->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
</configuration>

JavaConfig 方式 : 添加配置类

@Configuration
public class PageHelperConfig {
    @Bean
    public PageHelper pageHelper(){
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        //1.offsetAsPageNum:设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用.
        p.setProperty("offsetAsPageNum", "true");
        //2.rowBoundsWithCount:设置为true时,使用RowBounds分页会进行count查询.
        p.setProperty("rowBoundsWithCount", "true");
        //3.reasonable:启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页。
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

2.2、controller

PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);

image.png
这里设计返回的数据信息为Result,存储分页查询的结果,PageResult如下:
image.png

2.3、service

进入service层:

PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);

image.png
通过PageHelper.startPage()这种方式,插件会在底层生成SQL语句时自动添加LIMIT offset, pageSize子句,实现数据库级别的分页。
PageHelper.startPage()源码:
image.png

2.4、mapper

SQL语句如下:
image.png
看起来好像并没有分页查询的SQL语句,根据上文提到的,分页查询的SQL是由插件底层编写的。可以查看SpringBoot的控制台日志,如下:
image.png

当前员工id:1
员工分页查询,参数为:EmployeePageQueryDTO(name=null, page=1, pageSize=10)
Preparing: SELECT count(0) FROM employee
Parameters: 
  Total: 1
Preparing: select * from employee order by create_time desc LIMIT ?
Parameters: 10(Integer)
Total: 5
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐