1.构造方法
MapperMethod进行实例化,构造方法中调用静态内部类MethodSignature构造方法
public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {
this.command = new SqlCommand(config, mapperInterface, method);
this.method = new MethodSignature(config, mapperInterface, method);
}
1
2
3
4
MethodSignature构造方法中调用ParamNameResolver构造方法。
public MethodSignature(Configuration configuration, Class<?> mapperInterface, Method method) {
Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, mapperInterface);
if (resolvedReturnType instanceof Class<?>) {
this.returnType = (Class<?>) resolvedReturnType;
} else if (resolvedReturnType instanceof ParameterizedType) {
this.returnType = (Class<?>) ((ParameterizedType) resolvedReturnType).getRawType();
} else {
this.returnType = method.getReturnType();
}
//… 省略部分代码
this.paramNameResolver = new ParamNameResolver(configuration, method);
}
1
2
3
4
5
6
7
8
9
10
11
12
ParamNameResolver代码介绍:
- 先遍历所有不是RowBounds或者ResultHandler子类的参数
- 先判断参数中是否存在@Param注解,存在的话hasParamAnnotation设置true
- 将有@Param注解的参数的值赋予name
- 没有注解的将会判断isUseActualParamName是否为true[1],如果不设置java编译保留参数的话,将默认为arg0,arg1…argn,设置的话为参数本身名称。
- 如果是false,将得到当前names的大小,设为其值0,1,2,3,4…n。最后将参数位置和名字保存在SortedMap->names中。
举例:
public User getUserByNameAndDep(@Param(“name”)String name,String dep);
处理完之后names为:
如果是3.4.1以及之后版本,isUseActualParamName设置为true,且编译开关打开
0->name
1->dep
如果是3.4.1以及之后版本,isUseActualParamName设置为true,且编译开关未打开
0->name
1->arg1
如果是3.4.1以及之后版本,isUseActualParamName设置为false,或者是3.4.1之前版本
0->name
1->1
注意:索引位置为key,名字相同也不出错,后续的程序将会覆盖,比如:
public User getUserByNameAndDep(@Param(“dep”)String name,String dep);
如果是3.4.1以及之后版本,isUs