1. 程式人生 > 其它 >MyBatis之XML解析基類BaseBuilder

MyBatis之XML解析基類BaseBuilder

BaseBuilder是解析XML檔案的基類

BaseBuilder是一個抽象類,是其它XML解析類的父類,它持有Configuration物件,型別註冊器TypeAliasRegistry及型別處理器註冊物件TypeHandlerRegistry,,mybatis初始始化的過程就是完善Configuration物件中各屬性值的過程。

BaseBuilder的構造方法中要傳入Configuration物件。

public abstract class BaseBuilder {
  // 持有Configuration,TypeAliasRegistry,TypeHandlerRegistry物件
  protected final Configuration configuration;
  protected final TypeAliasRegistry typeAliasRegistry;
  protected final TypeHandlerRegistry typeHandlerRegistry;
  // 構造方法,客戶使用時傳入Configuration物件,從Configuration物件中獲得TypeAliasRegistry,TypeHandlerRegistry物件
  // 在解析XML檔案過程中,逐步填充Configuration物件  
  public BaseBuilder(Configuration configuration) {
    this.configuration = configuration;
    this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
    this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
  }
}    

BaseBuilder常見方法

**protected Class<? extends T> resolveClass(String alias) ** 根據別名從別名註冊器獲得Class物件

protected Object createInstance(String alias) 使用反射獲得別名型別的物件

protected TypeHandler resolveTypeHandler(Class javaType, Class> typeHandlerType) 獲得TypeHandler物件

原始碼如下:

// 獲得別名對應的Class物件,簡單由typeAliasRegistry實現
protected <T> Class<? extends T> resolveAlias(String alias) {
    return typeAliasRegistry.resolveAlias(alias);
}

// 根據別名獲得別名對應的物件
protected Object createInstance(String alias) {
  // 獲得別名對應的型別Class  
  Class<?> clazz = resolveClass(alias);
  if (clazz == null) {
    return null;
  }
  try {
    // 獲得預設構造方法物件,並建立物件  
    return clazz.getDeclaredConstructor().newInstance();
  } catch (Exception e) {
    throw new BuilderException("Error creating instance. Cause: " + e, e);
  }
}
// 獲得TypeHandler物件,由typeHandlerRegistry實現
protected TypeHandler<?> resolveTypeHandler(Class<?> javaType, Class<? extends TypeHandler<?>> typeHandlerType) {
    if (typeHandlerType == null) {
      return null;
    }
    // javaType ignored for injected handlers see issue #746 for full detail
    TypeHandler<?> handler = typeHandlerRegistry.getMappingTypeHandler(typeHandlerType);
    if (handler == null) {
      // not in registry, create a new one
      handler = typeHandlerRegistry.getInstance(javaType, typeHandlerType);
    }
    return handler;
}

BaseBuilder類體系結構

子類概述

XMLConfigBuilder解析mybatis配置檔案

XMLMapperBuilder解析mybatis對映檔案

MapperBuilderAssistant:XMLMapperBuilder的幫助類

XMLStatementBuilder解析對映檔案中的sql語句標籤insert|update|delete|select

XMLScriptBuilder SQL語句在XML檔案中,處理動態SQL語句標籤

SQLSourceBuilder:在RawSqlSource使用

,由SqlSessionFactoryBuilder建立,主要方法:

public Configuration parse()

解析XML配置檔案,返回Configuration物件

private void parseConfiguration(XNode root) 從根節點開始解析配置檔案,並將解析結果存到Configuration物件中

XMLMapperBuilder解析mybatis對映檔案,主要方法:

public void parse() 入口方法

private void configurationElement(XNode context)解析對映檔案根節點的namespace及所有子節點

MapperBuilderAssistant:XMLMapperBuilder的幫助類

XMLStatementBuilder解析對映檔案中的sql語句標籤insert|update|delete|select,主要方法:

public void parseStatementNode()解析語句節點

XMLScriptBuilder SQL語句在XML檔案中,處理動態SQL語句標籤

SQLSourceBuilder:在RawSqlSource使用,主要方法:

​ **public SqlSource parse(String originalSql, Class<?> parameterType, Map<String, Object> additionalParameters) **