Mybatis分页插件PageHelper的使用与原理解析
文章全面介绍mybatis分页插件的基本概念、使用方法、以及为何我们需要使用它。我们将通过五个部分来详细讲解,包括“是什么”、“如何使用”、“为什么要用它”、“原理”和“总结”。
一、是什么
PageHelper 是一个开源的 MyBatis 分页插件,它提供了简单易用的 API,可以方便地进行分页查询操作。使用 PageHelper 可以减少开发人员编写复杂的分页查询 SQL 语句的工作量,同时还支持多种数据库和多种分页方式。PageHelper 还提供了排序和筛选的功能,并且支持插件扩展,可以根据需求进行自定义。总的来说,PageHelper 是一个强大且方便的工具,可以大大简化在 MyBatis 中进行分页查询的操作。
二、如何使用
1、引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
<version>1.2.10</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
2、配置properties
#分页插件
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
3、编写代码
在我们查询前,加入PageHelper.startPage(page, pageSize)这样的语句,就会对后面的查询进行分页查询
int page = 1; // 当前页,从1开始
int pageSize = 10; // 每页数量
Page pageInfo = PageHelper.startPage(page, pageSize);
List<ForlanVO> result = forlanMapper.listByCondition(forlanVO);
三、为什么要用它?
在项目中,一般在列表查询,如果需要分页,就会使用Mybatis分页插件PageHelper,可以简化在 MyBatis 中进行分页查询的操作。
以下是一些使用 PageHelper 的好处:
-
简化分页查询:PageHelper 提供了简单易用的 API,可以方便地进行分页查询操作,无需手动编写复杂的 SQL 语句和计算分页参数。
-
支持多种数据库:PageHelper 支持多种数据库,包括 MySQL、Oracle、PostgreSQL 等,可以在不同的数据库中使用相同的分页方式。
-
支持物理分页和逻辑分页:PageHelper 支持物理分页和逻辑分页两种方式。物理分页是通过 SQL 语句中的 LIMIT 子句实现的,逻辑分页是通过在查询结果中进行筛选实现的。
-
支持排序和筛选:PageHelper 提供了排序和筛选的功能,可以根据指定的字段进行排序,并支持根据条件进行筛选。
-
支持分页插件扩展:PageHelper 提供了丰富的插件扩展机制,可以自定义分页插件的行为,满足不同的需求。
总的来说,使用 PageHelper 可以简化分页查询的操作,提高开发效率,并且具有良好的扩展性和兼容性。
四、原理
PageHelper是MyBatis的一个插件,内部其实实现了一个PageInterceptor拦截器
在我们使用过程中,使用PageHelper.startPage语句,会在当前线程上下文中设置一个ThreadLocal变量,PageInterceptor分页拦截器就会对其拦截,可以从ThreadLocal中拿到分页的信息,如果有分页信息,就拼接分页SQL(limit语句)进行分页查询,最后再把ThreadLocal中的东西清除掉
本质就是在我们执行SQL语句之前,自动给SQL语句拼接了分页的语句:limit 0,10
这样的话,使用起来就很方便,不用我们自己去拼接
返回的对象Page如下:
public class Page<E> extends ArrayList<E> implements Closeable {
private static final long serialVersionUID = 1L;
private int pageNum;
private int pageSize;
private int startRow;
private int endRow;
private long total;
private int pages;
private boolean count;
private Boolean reasonable;
private Boolean pageSizeZero;
private String countColumn;
private String orderBy;
private boolean orderByOnly;
省略方法...
}
可以看到信息很全,包含总数量,总页数,当前页,每页数量,排序信息等等
五、总结
- PageHelper使用了ThreadLocal来保存分页参数,分页参数和线程是绑定的。
因此,我们需要保证PageHelper.startPage后紧跟MyBatis查询方法,因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象,对于dubbo等RPC请求是不起作用的 - 使用方面,自动给我们拼接limit语句
- 获取的信息很丰富,满足我们的日常使用
更多推荐
所有评论(0)