MyBatis整合Spring的实现(10)

MyBatis的SQL解析也是一个非常重要的一部分。对应的类XMLMapperBuilder,在下面我们只是列出相应的方法,具体分析在后面文章介绍:

1 属性

/** 解析XML文档转换成DOM对象 */
private XPathParser parser;
private MapperBuilderAssistant builderAssistant;
private Map<String, XNode> sqlFragments;
private String resource;

继承了MyBatis整合Spring的实现(2)中1.2父类XMLConfigBuilder的属性。其它属性具体的功能可以后来补充。

2 XMLMapperBuilder实例化:

public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments) {
    this(new XPathParser(inputStream, true, configuration.getVariables(), new XMLMapperEntityResolver()),
        configuration, resource, sqlFragments);
  }
  private XMLMapperBuilder(XPathParser parser, Configuration configuration, String resource, Map<String, XNode> sqlFragments) {
    super(configuration);
    this.builderAssistant = new MapperBuilderAssistant(configuration, resource);
    this.parser = parser;
    this.sqlFragments = sqlFragments;
    this.resource = resource;
  }

这里只是对属性的赋值,还有创建了MapperBuilderAssistant对象。

MapperBuilderAssistant

3.1 属性

/** 当前命名空间 */
private String currentNamespace;
/** 资源 */
private String resource;
/** 当前缓存 */
private Cache currentCache;
private boolean unresolvedCacheRef;

此类也继承了MyBatis整合Spring的实现(2)中1.2父类XMLConfigBuilder的属性。

MyBatis整合Spring的实现(10)_第1张图片

上图就是此对象中的一个方法,原来此类的功能主要是获取对应的Mapping的,这里获取了ResultMapping,还有ParameterMapping等等,这里后面再具体分析。

4 具体解析代码:

public void parse() {
    if (!configuration.isResourceLoaded(resource)) {
      configurationElement(parser.evalNode("/mapper"));
      configuration.addLoadedResource(resource);
      bindMapperForNamespace();
    }
    parsePendingResultMaps();
    parsePendingChacheRefs();
    parsePendingStatements();
}
private void configurationElement(XNode context) {
    try {
      String namespace = context.getStringAttribute("namespace");
      if (namespace.equals("")) {
      throw new BuilderException("Mapper's namespace cannot be empty");
      }
      builderAssistant.setCurrentNamespace(namespace);
      cacheRefElement(context.evalNode("cache-ref"));
      cacheElement(context.evalNode("cache"));
      parameterMapElement(context.evalNodes("/mapper/parameterMap"));
      resultMapElements(context.evalNodes("/mapper/resultMap"));
      sqlElement(context.evalNodes("/mapper/sql"));
      buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
    }
}

代码就分解到这个程度,下面的文章对代码中每个方法进行分析。

你可能感兴趣的:(MyBatis整合Spring的实现(10))