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使用

posted @ 2022-04-09 15:32  beckwu  阅读(220)  评论(0)    收藏  举报