PageHelper

一、PageHelper的介绍

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

PageHelper 是国内非常优秀的一款开源 mybatis 分页插件,它支持常用的主流数据库,例如 Oracle、Mysql、MariaDB、SQLite、Hsqldb 等。
二、PageHelper的使用
2.1、引入依赖

pom中引入依赖

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

2.2、配置PageHelper(非必须)

    该步骤是非必须的,若不配置则是默认的,对正常使用影响不大。

在application.properties或application.yml中配置pagehelper相关属性,例如:

以application.yml为例:

pagehelper:
  helperDialect: mysql #指定数据库方言,这里以MySOL为例
  reasonable: true #分页合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
  supportMethodsArguments: true #支持通过Mapper接口参数传递分页参数
  params: count=countSql #用于从对象中根据属性名取值,这里配置count的SOL

这些参数的详细解释如下:

    helperDialect: 指定分页插件的数据库方言。PageHelper会自动检测当前的数据库链接,自动选择合适的分页方式。如果你使用的是MySQL,可以明确指定为mysql。
    reasonable: 是否启用分页合理化。如果启用,当pageNum<1时,会自动查询第一页的数据,当pageNum>pages时,自动查询最后一页数据;不启用的情况下,以上两种情况都会返回空数据。
    supportMethodsArguments: 是否支持通过Mapper接口参数来传递分页参数,默认值false。设置为true时,PageHelper会从查询方法的参数值中自动根据配置的字段取值,进行分页。 (具体使用见下方源码讲解)
    params: 用于从对象中根据属性名取值,可以配置pageNum, pageSize, count, pageSizeZero, reasonable等参数。这里的count=countSql表示在执行分页查询时,会使用countSql作为计算总数的SQL。

2.3、使用

PageHelper 的使用也非常简单,只需要在查询之前调用PageHelper.startPage() 方法即可开始分页。例如:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
	
	public PageInfo<User> listUser(UserQo qo) {
		// 设置分页参数
		PageHelper.startPage(qo.getPageNo(),qo.getPageSize());
		//查询数据
		List<User> result = userMapper.listByCondition(qo);
		// 使用PageInfo对查询结果进行封装,返回包含分页信息的对象
		return new PageInfo<>(result);
	}
}

 

UserMapper.xml文件

<mapper namespace="com.demo.mapper.UserMapper">
    <select id="listByCondition" resultType="com.demo.entity.User">
        select *  from user
        where 1=1
        <if test="name!= null and name!= '' ">
            name = #{name}
        </if>
        order by id
    </select>
</mapper>

 

PageHelper 的核心方法是 PageHelper.startPage(),它的作用是为当前线程开启分页上下文,并在接下来的查询中拦截 SQL,添加分页参数。
执行流程:

    PageHelper.startPage() 开启分页上下文,并设置分页参数。
    查询方法 userMapper.listByConfition(qo) 被拦截,PageHelper 在 SQL 后自动添加 LIMIT。
    查询返回结果后,使用 PageInfo 封装结果,同时计算总记录数、分页信息等。

posted @ 2025-09-09 15:59  休玛  阅读(48)  评论(0)    收藏  举报