简介
上篇文章中探索了查询语句的执行过程,下面我们接着来看看其中的查询参数的解析细节,是如何工作的
参数的解析
在日常的开发中,常见的参数有如下几种:
- 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

本文详细探讨了MyBatis3中参数解析的过程,包括参数解析前的准备工作,如ParamNameResolver如何初始化获取参数列表;参数值的初步获取,针对不同类型的参数(直接传入、Map传入、类传入)进行解析;以及PreStatement生成时如何使用解析后的参数。总结了参数初始化、获取、处理及在PreStatement生成中的应用。
最低0.47元/天 解锁文章
1037

被折叠的 条评论
为什么被折叠?



