这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
在昨日文章《若依系统分页工具学习-PageHelper篇八》中,我们在AbstractHelperDialect.beforePage
方法中发现了一个变量Page
,并且知道了PageHelper是通过ThreadLocal<Page>
来将其作为线程局部变量来巧妙的传递的。
今天我们接着看在通过beforePage
方法判断需要分页后,程序又执行了哪些逻辑?
接着看ExecutorUtil类的pageQuery方法:
1 | java复制代码 public static <E> List<E> pageQuery(Dialect dialect, Executor executor, MappedStatement ms, Object parameter, |
下一行代码注释为生成分页的缓存key,之间将参数cacheKey赋值给局部变量pageKey,不多阐述。
紧接着下一行:
1 | java复制代码//处理参数对象 |
这一行代码调用dialect处理参数方法处理parameter并且将返回值重新赋值给parameter参数。
我们来细细的看一下其中的参数处理逻辑。
通过前几篇文章,我们知道MysqlDialect的类层次结构:
Dialect -> AbstractDialect -> AbstractHelperDialect -> MySqlDialect
我们在最近的一层发现AbstractHelperDialect
中有其实现:
1 | java复制代码@Override |
我们逐行查看其处理逻辑:
1 | java复制代码//处理参数 |
Page参数不多叙述了,在文章《PageHelper篇八》中已经详细阐述。
这里有一个奇怪的点或者也可能是代码风格,通过检索
orderByOnly
我没有发现在什么情况下会设置其为false的代码逻辑,换句话说,目前orderByOnly默认值为false,而调用setOrderByOnly的情况只有setOrderByOnly(true)
接着往下看:
1 | java复制代码Map<String, Object> paramMap = null; |
前面两种if处理参数为空以及参数为map的情况。
下面代码涉及到多个参数相关的类,暂时不多解释。我们最关心的仍然是sql修改。
本文转载自: 掘金