Mybatis_源碼分析_參數封裝Map過程

使用ParamNameResolver解析封裝names的map;
方法註釋參數:(@Param("id")Integer id,@Param("lastName")String lastName)
names:{0=id,1=lastName},names在構造器是就確定了

name確定流程:
1.獲取每個標註了Param註解參數的值:id,賦值給name;
2.每次解析一個參數給map中存放信息:(key:參數索引,value:name的值)
 name的值:
  標註了Param的註解:註解的值
  沒有標註:
   1.全局配置:useActualParamName(jdk1.8):name=參數名
   2.name=map.size():相當於元素的索引

public Object getNamedParams(Object[] args) {
    final int ParamCount = names.size();
 //如果參數爲空直接返回
    if (args == null || ParamCount == 0) {
      return null;
  //如果只有一個元素並且是沒有Param註解,就直接調用arg[0],單元素直接返回
    } else if (!hasParamAnnotation && ParamCount == 1) {
      return args[names.firstkey()];
  //多個元素或者有Param標註
    } else {
      final Map<String, Object> Param = new ParamMap<Object>();
      int i = 0;
   //遍歷names集合:names的values作爲key;names集合的key作爲取值的參考arg[0]:args[1,"Tom"]
   //比如:{id=args[0]:1,lastName=args[1]:Tom}
      for (Map.Entry<Integer, String> entry : names.entrySet()) {
        Param.put(entry.getValue(), args[entry.getkey()]);
  //額外的將每一個參數也保存在map中,使用心得key:Param1...ParamN
  //效果有Param註解也已使用#{指定的key}或者#{Param1}
        final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
  
        if (!names.containsValue(genericParamName)) {
          Param.put(genericParamName, args[entry.getkey()]);
        }
        i++;
      }
      return Param;
    }
  }
 //確定names
public ParamNameResolver(Configuration config, Method method) {
 //首先拿到所有的參數、註解和標註參數的索引
    final Class<?>[] paramTypes = method.getParameterTypes();
    final Annotation[][] paramAnnotations = method.getParameterAnnotations();
    final SortedMap<Integer, String> map = new TreeMap<Integer, String>();
    int paramCount = paramAnnotations.length;
    // get names from @Param annotations
    for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {
      if (isSpecialParameter(paramTypes[paramIndex])) {
        // skip special parameters
        continue;
      }
      String name = null;
   //如果當前參數的註解是param註解就獲取註解的值
      for (Annotation annotation : paramAnnotations[paramIndex]) {
        if (annotation instanceof Param) {
          hasParamAnnotation = true;
          name = ((Param) annotation).value();
          break;
        }
      }
      if (name == null) {
        if (config.isUseActualParamName()) {
          name = getActualParamName(method, paramIndex);
        }
        if (name == null) {
          name = String.valueOf(map.size());
        }
      }
      map.put(paramIndex, name);
    }
    names = Collections.unmodifiableSortedMap(map);
  }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章