PageHelper原理分析

PageHelper 可以在不用写分页语句的情况下完成物理分页的效果。

1、引入依赖

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

2、配置PageHelper相关配置

#pagehelper分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
#如果启用supportMethodsArguments参数,则pageHelper可以自动拦截请求参数中的pageNum,pageSize参数
#不启用supportMethodsArguments参数,则需使用PageHelper.startPage(pageNum,pageSize)方法调用
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

pagehelper.helperDialect  配置方言属性  可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性

pagehelper.reasonable 分页合理化 如过开启了reasonable功能,并且用户传入的页数已经大于了总页数,则会将用户传入的pageNum修改为总页数pages。    默认值为false,需要设为true时生效。

pagehelper.params=count=countSql    如果请求参数   POJO或者Map中发现了countSql属性,就会作为count参数使用


pagehelper.supportMethodsArguments=true  #如果启用supportMethodsArguments参数,则pageHelper可以自动拦截请求参数中的pageNum,pageSize参数  不启用supportMethodsArguments参数,则需使用PageHelper.startPage(pageNum,pageSize)方法调用

 

3、pageHelper  分页主要代码 为 

PageHelper.startPage(pageNum,pageSize);  声明了该代码就能实现分页查询

源码:

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        Page<E> oldPage = getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }

        setLocalPage(page);
        return page;
    }
    protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();

    public PageMethod() {
    }

    protected static void setLocalPage(Page page) {
        LOCAL_PAGE.set(page);
    }

    public static <T> Page<T> getLocalPage() {
        return (Page)LOCAL_PAGE.get();
    }

其原理为将分页的参数 复制到 localPage 中,保存了当前分页线程的Page参数的变量,这样可以保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,重新拼装分页SQL,完成分页。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PageHelper是一个常用的用于在持久层使用mybatis进行后台分页的工具。它使用了ThreadLocal来保存分页参数,确保分页参数和线程绑定。具体来说,PageHelper原理是通过startPage方法来开启分页功能。这个静态方法接受参数包括页码(pageNum)、每页显示数量(pageSize)、是否进行count查询(count)、分页合理化(reasonable)和是否返回全部结果(pageSizeZero)等。在方法内部,它创建了一个Page对象,并设置了相应的参数。同时,如果之前已经执行过orderBy操作,startPage方法会将之前的orderBy信息复制到新的Page对象中。最后,startPage方法将新的Page对象保存到ThreadLocal中。这样,在MyBatis查询方法中,PageHelper会根据ThreadLocal中保存的Page对象来进行分页处理。需要注意的是,为了确保安全,我们需要确保在PageHelper的startPage方法调用后紧跟着MyBatis的查询方法。此外,PageHelper还在finally代码段中自动清除了ThreadLocal存储的对象,以防止内存泄漏问题的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [分页插件PageHelper工作原理](https://blog.csdn.net/fedorafrog/article/details/104412140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值