当前位置:   article > 正文

Mybatis分页插件PageHelper的使用与原理解析_pagehelper要使用吗

pagehelper要使用吗

一、是什么

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2、配置properties

#分页插件
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、编写代码

在我们查询前,加入PageHelper.startPage(page, pageSize)这样的语句,就会对后面的查询进行分页查询

int page = 1; // 当前页,从1开始
int pageSize = 10; // 每页数量
Page pageInfo = PageHelper.startPage(page, pageSize);
List<ForlanVO> result = forlanMapper.listByCondition(forlanVO);
  • 1
  • 2
  • 3
  • 4

三、为什么要用它?

在项目中,一般在列表查询,如果需要分页,就会使用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;
	
	省略方法...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以看到信息很全,包含总数量,总页数,当前页,每页数量,排序信息等等

五、总结

  • PageHelper使用了ThreadLocal来保存分页参数,分页参数和线程是绑定的。
    因此,我们需要保证PageHelper.startPage后紧跟MyBatis查询方法,因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象,对于dubbo等RPC请求是不起作用的
  • 使用方面,自动给我们拼接limit语句
  • 获取的信息很丰富,满足我们的日常使用
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/88338
推荐阅读
相关标签
  

闽ICP备14008679号