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;
  



XMLConfigBuilder

XMLConfigBuilder解析mybatis-config.xml核心类。解析出mybatis的配置项、加载插件、加载映射文件调用XMLMapperBuilder进行解析。

public class XMLConfiguration extends BaseBuilder 

  // mybatis加载解析mybatis-config.xml全局只一次
  private boolean parsed;
  //  xml文档语法解析器
  private final XPathParser parser;
  // 当前设置的环境,每一个environment对应一套环境
  private String environment;
  private final Mybatis框架解析之Builder解析

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

MyBatis 动态 SQL 之通用 where

Mybatis在Spring环境下的启动顺序

java中的mybatis是什么?

mybatis查找typeHandler过程分析