一、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 {@Autowiredprivate 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 userwhere 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 封装结果,同时计算总记录数、分页信息等。