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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值