XMLMapperBuilder类

涉及到的类包括:
MapperBuilderAssistant:Mapper文件解析辅助类,包括了解析各种节点的方法。
BaseBuilder:XMLMapperBuilder与MapperBuilderAssistant的父类,保存了Configuration、TypeAliasRegistry、TypeHandlerRegistry三个属性。
TypeAliasRegistry:别名对应关系,保存了字符串与类的对应信息,例如“String”字符串对应 String.class
TypeHandlerRegistry:注册java.lang与java.sql类型对应关系
Configuration:Mapper文件解析节点完成后,存储解析后的属性信息。
XMLStatementBuilder:解析SQL语句节点类,解析后存储在Configuration下的mappedStatements属性
 
 
XMLMapperBuilder用于解析Mapper文件,包括namespace、parameterMap、resultMap以及各种SQL(insert/uppdate/delete/select)
解析过程中主要是parse()方法,
 
解析Mapper文件后会存储在MapperBuilderAssistant以及它父类BaseBuilder的实例下,主要是Configuration类
private final MapperBuilderAssistant builderAssistant;
 
构造方法
//第一个参数是Mapper.xml的InputStream输入流
//第二个参数是配置信息
//第三个参数是Mapper.xml资源位置信息
//第四个参数是从Mapper.xml解析出来的XML片段
  public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments) {
    this(new XPathParser(inputStream, true, configuration.getVariables(), new XMLMapperEntityResolver()),
        configuration, resource, sqlFragments);
  }
解析方法:
 public void parse() {
//判断Mapper文件是否已经加载过
    if (!configuration.isResourceLoaded(resource)) {
//解析Mapper文件
      configurationElement(parser.evalNode("/mapper"));
      configuration.addLoadedResource(resource);
      bindMapperForNamespace();
    }

    parsePendingResultMaps();
    parsePendingCacheRefs();
    parsePendingStatements();
  }
//解析Mapper文件方法:
(解析后的大部分内容都存储在MapperBuilderAssistant-》BaseBuilder-》Configuration对象中
Configuration类下的属性:

)
private void configurationElement(XNode context) {
    try {
      String namespace = context.getStringAttribute("namespace");
      if (namespace == null || namespace.equals("")) {
        throw new BuilderException("Mapper's namespace cannot be empty");
      }
      builderAssistant.setCurrentNamespace(namespace);
//解析cache-ref节点
      cacheRefElement(context.evalNode("cache-ref"));
//解析cache节点
      cacheElement(context.evalNode("cache"));
//解析parameterMap节点
      parameterMapElement(context.evalNodes("/mapper/parameterMap"));
//解析resultMap节点
      resultMapElements(context.evalNodes("/mapper/resultMap"));
//解析sql节点
      sqlElement(context.evalNodes("/mapper/sql"));
//解析select|insert|update|delete节点
      buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);
    }
  }
收藏文章数量从多到少与“把书读薄”是一个道理
原文地址:https://www.cnblogs.com/use-D/p/9570330.html