若依系统分页工具学习-PageHelper篇十四

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

在前几篇文章中,我们查看了PageHeler中的包com.github.pagehelper以及子包com.github.pagehelper.cache中的类与结构,并且借着cache包中类的写法了解到工厂模式以及java中另外一种类加载与创建对象的方法:Class.forName,以及通过GuavaCache以及SimpleCache熟悉了xxxBuilder创建对象的方式。

读源码就跟读文章一样

今天我们来学习另外一个子包:com.github.pagehelper.page。(按照字母大小应该讲com.github.pagehelper.dialect子包,但是dialect比较复杂,我们暂且放一下,了解了其他部分再反过来看它。)

page包

page包中有4个文件,以及其中的基础注释如下:

PageAutoDialect.java:基础方言信息。

PageBoundSqlInterceptors.java。

PageMethod.java: 基础分页方法。

PageParams.java: 参数信息

我们一一来看。

PageParams

PageParams,参数信息,包括属性包括:offsetAsPageNum(相当于pageNum),rowBoundsWithCount(布尔值,是否进行count查询),pageSizeZero(布尔值,true时不执行分页,返回全部结果),reasonable(布尔值,分页合理化),supportMethodsArguments(布尔值,是否支持接口参数来传递分页参数),countColumn(字符串,默认值0)。 方法除基础的setter/getter外,还有两个方法:

Page getPage(Object parameterObject, RowBounds rowBounds)

以及通过配置来初始对象的方法:

void setProperties(Properties properties)

setProperties中大量使用了java.util.Properties类的方法,我们来了解一下这个java通用工具。

java.util.Properties实现了接口Map,Serializable, Clonable,并且该类是线程安全的,即多个线程可以共享单个 Properties 对象而无需进行外部同步。最主要的两个方法是:获取属性值getProperty(String key)与设置属性值setProperty(String key, String value)

其他常用方法还有:从文件加载:load(InputStream), 将配置写入文件store(OutStream, String comments) 等。

PageBoundSqlInterceptors

该类包括一个接口参数值BoundSqlInterceptor.Chain及其getter方法,以及另外一个方法void setProperties(Properties properties)

通过阅读代码,我们发现setProperties其实就是对Chain的setter方法:通过在参数boundSqlInterceptors上配置多个类名,并通过Class.forName(xx).newInstance()创建其对象实体,之后调用BoundSqlInterceptorChain(Chain接口的一个实现)的构造函数创建一个Chain实体对象。

换句话说,这样就将sql的拦截器按照一定的次序保存在了PageBoundSqlInterceptors.chain中。

Guess you like

Origin juejin.im/post/7034862196152598536