在前几篇文章中,我们查看了 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
中。
专栏:若依框架