Mybatis源码学习笔记(二) 配置介绍

配置介绍

在上篇文章的例子中,我们可以看到,Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互。

这里写图片描述

所以我们要知道如何构建SqlSessionFactory的,通过下面这段代码可以知道,是通过SqlSessionFactoryBuilder的build方法构建的。那么,先从SqlSessionFactoryBuilder入手:

// Reader读取mybatis配置文件,传入构造方法 而这里的Reader就是Resources.getResourceAsReader(resource)方法返回的
// 除了Reader外,其实还有对应的inputStream作为参数的构造方法 就在这段源码的下方 这里暂时先不贴了
public SqlSessionFactory build(Reader reader) {
    return build(reader, null, null);
  }

  public SqlSessionFactory build(Reader reader, String environment) {
    return build(reader, environment, null);
  }

// mybatis配置文件 + properties, 此时mybatis配置文件中可以不配置properties,也能使用${}形式
  public SqlSessionFactory build(Reader reader, Properties properties) {
    return build(reader, null, properties);
  }

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      //XMLConfigBuilder  通过parse方法 来解析configuration.xml文件
      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.
      }
    }
  }

二、XMLConfigBuilder 类:

  // 构建一个 XMLConfigBuilder对象

  //这里通过传入一个reader 是否进行验证的布尔值 Properties对象 XMLMapperEntityResolver对象(用来找到对应的dtd文件) 来构造一个XML解析器 XPathParser

  // 这个解析器中
  // private Document document;  用来解析xml文件
  // private boolean validation; 验证
  // private EntityResolver entityResolver; 通过key查找dtd文件
  // private Properties variables;
  // private XPath xpath; 将元素转换成为节点信息

  // URL和mybatis的dtd文件用map做了一个映射,每个配置文件中有一个PUBLICID和SYSTEMID 这个是我们注册的key 而EntityResolver是一个接口 实现这个接口可以去寻找dtd文件

  public XMLConfigBuilder(Reader reader, String environment, Properties props) { 
    this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
  }

 // 对解析器XPathParser environment Properties 对象进行初始化
  private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
    super(new Configuration());
    ErrorContext.instance().resource("SQL Mapper Configuration");
    // 将已配置的Properties属性set到Configuration对象中
    // configuration这个对象会装载所有解析mybatis配置文件的所有节点元素
    this.configuration.setVariables(props);
    this.parsed = false;
    this.environment = environment;
    this.parser = parser;
  }

  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    //从根节点 configuration 入手解析
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

  //从源码中可以看出  configuration节点为根节点

  // 在configuration节点之下,我们可以配置10个子节点, 分别为:properties、typeAliases、plugins、objectFactory、objectWrapperFactory、settings、environments、databaseIdProvider、typeHandlers、mappers

  private void parseConfiguration(XNode root) {
    try {
      propertiesElement(root.evalNode("properties")); //issue #117 read properties first
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      settingsElement(root.evalNode("settings"));
      environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
      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);
    }
  }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值