mybatis学习-配置加载

编者按:

  1. 基于mabatis3.0.1
  2. 尝试从架构和产品设计维度重读一点代码
  3. git version hash: d929486dc250f1b9e6cf45720e59456ed8d6478b

xml配置型的配置和Mapper.xml加载

加载栈


image.png

注解型的配置和Mapper加载

1. xml和注解配置的读取优先顺序
  • xml配置优先
MapperAnnotationBuilder.java

public void parse() {
    String resource = type.toString();
    if (!configuration.isResourceLoaded(resource)) {
      configuration.addLoadedResource(resource);
      //优先调用了xml配置解析
      loadXmlResource();
      assistant.setCurrentNamespace(type.getName());
      parseCache();
      parseCacheRef();
      Method[] methods = type.getMethods();
      for (Method method : methods) {
        parseResultsAndConstructorArgs(method);
        parseStatement(method);
      }
    }
  }

  private void loadXmlResource() {
    String xmlResource = type.getName().replace('.', '/') + ".xml";
    Reader xmlReader = null;
    try {
      xmlReader = Resources.getResourceAsReader(type.getClassLoader(), xmlResource);
    } catch (IOException e) {
      // ignore, resource is not required
    }
    if (xmlReader != null) {
      XMLMapperBuilder xmlParser = new XMLMapperBuilder(xmlReader, assistant.getConfiguration(), xmlResource, sqlFragments, type.getName());
      xmlParser.parse();
    }
  }
2. 配置缓存key的生成

结果如: org.mybatis.example.BlogMapper.add-Blog

private String generateResultMapName(Method method) {
    StringBuilder suffix = new StringBuilder();
    for (Class c : method.getParameterTypes()) {
      suffix.append("-");
      suffix.append(c.getSimpleName());
    }
    if (suffix.length() < 1) {
      suffix.append("-void");
    }
    return type.getName() + "." + method.getName() + suffix;
  }

//id = applyCurrentNamespace(id);
public String applyCurrentNamespace(String base) {
    if (base == null) return null;
    if (base.contains(".")) return base;
    return currentNamespace + "." + base;
  }
3. 做成只读型

Collections.unmodifiableXXX

// lock down collections
      resultMap.resultMappings = Collections.unmodifiableList(resultMap.resultMappings);
      resultMap.idResultMappings = Collections.unmodifiableList(resultMap.idResultMappings);
      resultMap.constructorResultMappings = Collections.unmodifiableList(resultMap.constructorResultMappings);
      resultMap.propertyResultMappings = Collections.unmodifiableList(resultMap.propertyResultMappings);
      resultMap.mappedColumns = Collections.unmodifiableSet(resultMap.mappedColumns);

Resources工具类

package org.apache.ibatis.io;
/**
 * A class to simplify access to resources through the classloader.
 */
public class Resources {
  • 挺多实用方法


    image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容