简介
上篇文章中探索了查询语句的执行过程,下面我们接着来看看其中的查询参数的解析细节,是如何工作的
参数的解析
在日常的开发中,常见的参数有如下几种:
- 1.直接传入: func(Object param1, Object param2, …)
- 2.放入Map中进行传入:func(Map<String, Object> param)
- 3.类传入: func(Object param)
上面的请求是如何对应的呢,下面让我们带着疑问跟着源码走一走
参数解析前的相关准备工作
在上篇中,在ParamNameResolver有获取参数列表的代码,大体上从names中遍历获取的,这里就涉及到names的初始化的相关代码,如下:
public class ParamNameResolver {
public static final String GENERIC_NAME_PREFIX = "param";
private final boolean useActualParamName;
private final SortedMap<Integer, String> names;
private boolean hasParamAnnotation;
// 初始化话的时候,将相关的name已初始化好
public ParamNameResolver(Configuration config, Method method) {
this.useActualParamName = config.isUseActualParamName();
Class<?>[] paramTypes = method.getParameterTypes();
Annotation[][] paramAnnotations = method.getParameterAnnotations();
SortedMap<Integer, String> map = new TreeMap();
int paramCount = paramAnnotations.length;
for(int paramIndex = 0; paramIndex < paramCount; ++paramIndex) {
if (!isSpecialParameter(paramTypes[paramIndex])) {
String name = null;
Annotation[] var9 = paramAnnotations[paramIndex];
int var10 = var9.length;
for(int var11 = 0; var11 < var10; ++var11) {
Annotation annotation = var9[var11];
if (annotation instanceof Param) {
this.hasParamAnnotation = true;
name = ((Param)annotation).value();
break;
}
}
if (name == null) {
if (this.useActualParamName) {
name = this.getActualParamName(method, paramIndex);
}
if (name == null) {
name = String.valueOf(map.size