在前几篇文章中,我们查看了 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中。