mybatis之builder包处理mybatis初始化

Posted 我爱看明朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis之builder包处理mybatis初始化相关的知识,希望对你有一定的参考价值。

mybatis之builder包处理mybatis初始化

mybatis有两种xml的文件,一种是Mybatis-config.xml负责配置mybatis的各种配置以及指定映射文件;一种是xml映射文件负责sql。
其中配置文件有很多子节点,各自有各自的功能,xml也有多种子节点resultMap、sql、select、insert、update要解析这些复杂的配置为对象,一个简单的类肯定是不够的,
这个时候就需要各个不通职责的子类合作来解析配置和映射文件。mybatis通过建造者模式来解析配置文件和映射文件。

建造者模式: 是将一个复杂的对象的构建与它的标识分离。使得同样的构建过程可以创建不同的表示。建造者隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的>方式,动态的创建具有符合属性的对象。

BaseBuilder XMLMapperBuilder XMLStatementBuilder XMLConfigBuilder SqlSourceBuilder MapperBuilderAssistant 解析映射文件 析sql语句 解析mybatis配置文件 解析sql语句 解析过程中的一些辅助类

调用关系

读取myabits-config.xml的配置,解析各个子节点,以及配置的映射文件,解析映射文件中的各个子节点。

SqlSessionFactoryBuilder.build() : 读取mybatis配置文件
    XMLConfigBuilder.parse() : 解析配置文件
        XMLMapperBuilder.parse() : 解析映射文件
            XMLStatementBuilder.parseStatementNode() : 解析映射文件中select|insert|update|delete子节点
                RawLanguageDriver.createSqlSource() : 开始解析节点中的sql语句
                    XMLLanguageDriver.createSqlSource() :
                        XMLScriptBuilder.parseScriptNode() : 负责解析sql中的动态语句
                            RawSqlSource.RawSqlSource() :构造方法
                                SqlSourceBuilder.parse() :
SqlSessionFactoryBuilder.build()
XMLConfigBuilder.parse()
XMLMapperBuilder.parse()
XMLStatementBuilder.parseStatementNode()
RawLanguageDriver.createSqlSource()
XMLLanguageDriver.createSqlSource()
XMLScriptBuilder.parseScriptNode()
RawSqlSource.RawSqlSource()
SqlSourceBuilder.parse()
SqlSessionFactoryBuilder
XMLConfigBuilder
XMLMapperBuilder
XMLStatementBuilder
RawLanguageDriver
XMLLanguageDriver
XMLScriptBuilder
RawSqlSource
SqlSourceBuilder

BaseBuilder

解析配置文件和映射文件的基础类,存储了configuration、配置类型别名、类型处理器、及通过string查询JDBC枚举类型,为子类提供公共服务。


public abstract class BaseBuilder {
  //  mybatis配置文件解析的对象
  protected final Configuration configuration;
  // 类型别名,减少代码中的冗余
  protected final TypeAliasRegistry typeAliasRegistry;
  // 类型处理器
  protected final TypeHandlerRegistry typeHandlerRegistry;

  public BaseBuilder(Configuration configuration) {
    this.configuration = configuration;
    this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
    this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
  }

  public Configuration getConfiguration() {
    return configuration;
  }

  // 类型转换 子类XMLConfigBuilder转换从mybatis-config.xml读取到的配置值
  protected Pattern parseExpression(String regex, String defaultValue) {
    return Pattern.compile(regex == null ? defaultValue : regex);
  }

  protected Boolean booleanValueOf(String value, Boolean defaultValue) {
    return value == null ? defaultValue : Boolean.valueOf(value);
  }

  protected Integer integerValueOf(String value, Integer defaultValue) {
    return value == null ? defaultValue : Integer.valueOf(value);
  }

  protected Set<String> stringSetValueOf(String value, String defaultValue) {
    value = (value == null ? defaultValue : value);
    return new HashSet<String>(Arrays.asList(value.split(",")));
  }


   // 根据字符串查询JdbcType枚举
   protected JdbcType resolveJdbcType(String alias) {
    if (alias == null) {
      return null;
    }
    try {
      return JdbcType.valueOf(alias);
    } catch (IllegalArgumentException e) {
      throw new BuilderException("Error resolving JdbcType. Cause: " + e, e);
    }
  }


 // 根据类型别名查询对应的对象
 protected Class<?> resolveAlias(String alias) {
    return typeAliasRegistry.resolveAlias(alias);
  }

 // 查询类型处理器
 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;
  }

}

以上是关于mybatis之builder包处理mybatis初始化的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis框架解析之Builder解析

mybatis系统性详解(学习笔记)

MyBatis 动态 SQL 之通用 where

Mybatis在Spring环境下的启动顺序

java中的mybatis是什么?

mybatis查找typeHandler过程分析