PageHelper物理分页使用教程

2021-08-25 01:21:00  晓掌柜  版权声明:本文为站长原创文章,转载请写明出处


一、前言

        在系统开发时,一个很重要的操作就是分页数据的查询。在之前,我这边使用的是select SQL_CALC_FOUND_ROWS XXX; 

    加上 select found_rows() as DataCounts; 的模式来进行分页数据的查询,简单来说就是执行两条sql语句,然后在返回结果中进

    行解析。

        但是这个操作对数据库配置是有要求的,而且在编写sql以及解析数据时都要进行两次操作,所以这部分是要优化掉的。后面我

    寻找到了pagehelper这一款mybatis物理分页插件,他能较好的实现复杂单表和多表的分页问题。接下来我们就一起看一下吧。


二、什么是pagehelper

    2.1、关于pagehelper

        pagehelper是一款开源的第三方mybatis的物理分页插件,通过引入maven依赖和简单的配置,我们可以对当前执行的sql进行分页

    处理。

    2.2、实现原理

        ① pageHelper使用了静态的 ThreadLocal 参数,每次的操作信息是放在线程里面的(分页参数和线程绑定),每一个ThreadLocal

        不会互相干扰,多线程情况下,ThreadLocal1获取到ThreadLocal1的参数,并不会和ThreadLocal2有数据交叉,有着较好的数据隔离。

        ② 通过拦截器,获取到对应线程之中的预编译的sql,然后做分页的二次处理(你可以发现,sql被加上了limit和select count(0))然后

        编译执行。

    2.3、部分源码

        

        


三、整合pageHelper

    3.1、依赖引入


        <!-- pageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>

    3.2、在代码中使用


    public R pageOrderMainService(int page,int limit) {
        <!-- 配置分页属性 -->
        PageHelper.startPage(page, limit);
        <!-- 紧跟要分页的sql执行语句 -->
        List<OrderMainServicePageDTO> orderMainDTOList = bhServiceDao.pageOrderMainService(page,limit);
Page pageHelper = (Page) orderMainDTOList;
return R.ok().put("data", orderMainDTOList).put("count", pageHelper.getTotal());
}


四、注意事项

    4.1、分页语句顺序

        pageHelper的分页处理仅对紧跟着的sql语句有效,也就是说你跟随了两个sql语句的话,第二个是不进行分页处理的!

    4.2、线程安全

        pageHelper每次都会在finally中清除ThreadLocal对象,如果在pageHelper执行前发生了异常,就会导致线程不可用。


PageHelper.startPage(1, 10);
List<User> list;
if(param1 != null){
list = userMapper.selectIf(param1);
} else {
list = new ArrayList<User>();
}

<!-- 可以采用线面的方式进行完善 -->

List<User> list;
if(param1 != null){
PageHelper.startPage(1, 10);
list = userMapper.selectIf(param1);
} else {
list = new ArrayList<User>();
}

PS:当然也可以使用PageHelper.clearPage(); 进行手动处理!

        这种情况下:声明了PageHelper并放置到了ThreadLocal中,但是在执行之前,抛出了异常就会使得这个ThreadLocal没有

    被消费。那当这个线程再次被使用的时候,就会导致一个可能不使用分页的sql去消费这个分页参数了!


五、后记

    这篇文章旨在记录pageHelper如何接入及简单使用,其中的源码部分也是可以去细看的。这个我后续也会分享一下...

    更多精彩,请持续关注:guangmuhua.com


最新评论: