zoukankan      html  css  js  c++  java
  • 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);
        }
      }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    java8大排序
    如何删除oracle 的用户及其数据
    JavaScript开发者常忽略或误用的七个基础知识点
    Vim学习指南
    5个开发人员不应该错过的最好跨平台PHP编辑器
    OpenGL 简介
    web 页面内容优化管理与性能技巧
    创建高性能移动 web 站点
    近期十大优秀jQuery插件推荐
    30本世界名著浓缩成的经典话语
  • 原文地址:https://www.cnblogs.com/use-D/p/9570330.html
Copyright © 2011-2022 走看看