聊聊Mybatis的初始化之建造者模式

聊聊Mybatis的初始化之建造者模式

Mybatis首先会加载和解析全局配置文件,调用SqlSessionFactoryBuilder.build() 方法

构建SqlSession工厂类

SqlSessionFactoryBuilder.build() 方法:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }
  1. 构造XMLConfigBuilder对象,
  2. 调用parser.parse()方法进行xml文件的解析,返回Configuration对象,配置文件的全部配置信息都保存在Configuration对象中
  3. 调用build()方法生成DefaultSqlSessionFactory对象返回

解析xml文件

下面看一下XMLConfigBuilder的parse()方法:

public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

  private void parseConfiguration(XNode root) {
    try {
      // issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      loadCustomLogImpl(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

解析xml中的properties标签,这个标签一般定义连接数据库的url 驱动 用户名密码等等,KV形式,保存在Properties类的对象中

解析xml中的settings标签,这个标签是mybatis的全局性配置,比如开启二级缓存,懒加载等,保存在Properties类中

解析xml中的typeAliases标签,这个标签用于设置类的别名,记录到TypeAliasRegistry对象

解析xml中的typeHandler标签,这个标签用于设置类型转换器,类型转换器就是实现java和jdbc之间的类型转换,记录在TypeHandlerRegistry中

解析xml中的plugins标签,这个标签可以在执行过程中的某一点进行拦截调用,自定义类实现Interceptor接口就可以,保存在Configuration对象

解析xml中的对象工厂objectFactory标签,这个标签可以用来配置自定义的对象工厂,使用的时候继承Mybatis的DefaultObjectFactory类,在创建结果对象实例的时候会被调用,这个解析了也是保存在Configuration对象中

解析xml中的对象包装工厂objectWrapperFactory标签

解析xml中的创建和缓存Reflector对象的reflectorFactory标签,可以自定义工厂类继承DefaultReflectorFactory类

解析xml中的environments标签,这个标签用来配置不同的环境,包括transactionManager事务管理器标签和dataSource数据源标签

解析xml中的databaseIdProvider标签,这个标签是数据库厂商的标识,解析的标签保存了DatabaseIdProvider对象中,调用getDatabaseId()获取databaseId来确定数据库厂商

解析mappers标签,mappers标签想必大家都比较熟悉了,就是对应xml文件

总结

本篇主要介绍了Mybatis解析全局配置文件的标签的内容,采用了建造模式通过各种Xml文件的解析来构建Configuration对象,最终创建出SqlSessionFactory工厂类,思想值得借鉴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值