• 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);
        }
      }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    Django 2.1 配sql server 2008R2
    1.内网安全代理技术
    3.frp搭建socks5代理
    2.变量常量和注释
    1.域环境&工作组&局域网探针方案
    4.nps搭建socks5代理
    1.php介绍和安装
    2.内网安全隧道技术
    3.横向smb&wmi明文或hash传递
    5.域横向CobaltStrike&SPN&RDP
  • 原文地址:https://www.cnblogs.com/use-D/p/9570330.html
Copyright © 2020-2023  润新知