若依框架---PageHelper分页(二)

简介: 若依框架---PageHelper分页(二)

昨天我们讲到若依系统中使用PageHelper来实现分页,从而实现了无需编写分页代码而实现了分页。

但是我们并没有阐述PageHelper的具体逻辑。今天我们来学习一下PageHelper是如何实现的?


PageHelper介绍


PageHelper是与Mybatis密不可分的。其网址为pagehelper.github.io/,在首页的大标题就是:MyBatis分页插件PageHelper。并且在Github与Gitee上均有源代码部署。


Github:github.com/pagehelper/…


Gitee:gitee.com/free/Mybati…


因为国内访问Github不稳定,我们通过Gitee来查看介绍内容与源码。


startPage()


我们最关心的仍然是startPage函数,下载PageHelper源码后,首先我们查找startPage函数的源码:

/**
 * 基础分页方法
 *
 * @author liuzh
 */
public abstract class PageMethod {
    其他属性与参数
    /**
     * 开始分页
     *
     * @param pageNum      页码
     * @param pageSize     每页显示数量
     * @param count        是否进行count查询
     * @param reasonable   分页合理化,null时用默认配置
     * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
     */
    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page<E>(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        //当已经执行过orderBy的时候
        Page<E> oldPage = getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }
        setLocalPage(page);
        return page;
    }
    其他函数
}


方法的前三行,构造了一个Page<E>对象,对象page中包含了分页相关参数,如pageSize与pageNum。


第5行代码Page<E> oldPage = getLocalPage();,我们来看看做了什么?

/**
 * 基础分页方法
 *
 * @author liuzh
 */
public abstract class PageMethod {
    protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
    /**
     * 设置 Page 参数
     *
     * @param page
     */
    protected static void setLocalPage(Page page) {
        LOCAL_PAGE.set(page);
    }
    /**
     * 获取 Page 参数
     *
     * @return
     */
    public static <T> Page<T> getLocalPage() {
        return LOCAL_PAGE.get();
    }
}


pageHelper中使用ThreadLocal来实现将分页数据保存在当前线程中。ThreadLocal本篇暂时不展开讲述,大家可理解为一个线程本地变量


如此,我们便知道PageHelper是通过ThreadLocal将分页变量保存在当前线程中,以便后续查询获取。


那么后续执行时又是如何通过PageHelper将分页sql插入原sql的呢?


题外话


TheadLocal


这个类我最初是在阿里巴巴的Java编码规范中看到的,当时是讲述Java中时间的格式化问题容易引发多线程并发问题导致时间格式化出错,从而引入说使用ThreadLocal可以规避这一问题。


DateFormat是线程非安全的, 一般在多线程环境下, 必须为每一次日期时间的转换创建一个DateFormat

另外在格式时间时,发现编辑器推荐了两种很“优雅”的日期格式化方式:

public static final ThreadLocal<DateFormat> df_Ch_yyyy_MM_dd_HH_mm = 
      ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy年MM月dd日HH:mm"));
public static final ThreadLocal<DateFormat> df_year_month_day_hour_minutes = new ThreadLocal<DateFormat>(){  
       @Override  
       protected DateFormat initialValue(){
           return new SimpleDateFormat("yyyy-MM-dd HH:mm");
       }  
   };
目录
相关文章
|
2月前
|
SQL 数据库
若依框架---PageHelper分页(六)
若依框架---PageHelper分页(六)
74 0
|
2月前
|
SQL Java 数据库连接
若依框架---PageHelper分页(四)
若依框架---PageHelper分页(四)
86 0
|
2月前
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(七)
若依框架---PageHelper分页(七)
69 0
|
2月前
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
92 0
|
2月前
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(五)
若依框架---PageHelper分页(五)
75 0
|
2月前
|
SQL Java 数据库连接
若依框架---PageHelper分页(三)
若依框架---PageHelper分页(三)
126 0
|
2月前
|
SQL Java 关系型数据库
PageHelper分页插件最新源码解读及使用
PageHelper分页插件最新源码解读及使用
|
2月前
|
前端开发 关系型数据库 MySQL
springboot+jpa+tymeleaf实现分页功能
springboot+jpa+tymeleaf实现分页功能
18 0
|
2月前
|
SQL 缓存
若依框架---PageHelper分页(九)
若依框架---PageHelper分页(九)
52 0
|
2月前
|
SQL 监控 Java
若依框架---PageHelper分页(十)
若依框架---PageHelper分页(十)
71 0