• Mybatis 系列2-配置文件


    【Mybatis 系列10-结合源码解析mybatis 执行流程】

    【Mybatis 系列9-强大的动态sql 语句】

    【Mybatis 系列8-结合源码解析select、resultMap的用法】 

    【Mybatis 系列7-结合源码解析核心CRUD配置及用法】

    【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvider、plugins、mappers】

    【Mybatis 系列5-结合源码解析TypeHandler】 

    【Mybatis 系列4-结合源码解析节点typeAliases】

    【Mybatis 系列3-结合源码解析properties节点和environments节点】

    【Mybatis 系列2-配置文件】

    【Mybatis 系列1-环境搭建】

    上篇文章 写了一个Demo简单体现了一下Mybatis的流程。

    本次,将简单介绍一下Mybatis的配置文件

    上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSessionFactory,

    那么,我们就先从SqlSessionFactoryBuilder入手, 咱们先看看源码是怎么实现的:

    SqlSessionFactoryBuilder源码片段:

     1 public class SqlSessionFactoryBuilder {
     2  2 
     3  3   //Reader读取mybatis配置文件,传入构造方法
     4  4   //除了Reader外,其实还有对应的inputStream作为参数的构造方法,
     5  5   //这也体现了mybatis配置的灵活性
     6  6   public SqlSessionFactory build(Reader reader) {
     7  7     return build(reader, null, null);
     8  8   }
     9  9 
    10 10   public SqlSessionFactory build(Reader reader, String environment) {
    11 11     return build(reader, environment, null);
    12 12   }
    13 13   
    14 14   //mybatis配置文件 + properties, 此时mybatis配置文件中可以不配置properties,也能使用${}形式
    15 15   public SqlSessionFactory build(Reader reader, Properties properties) {
    16 16     return build(reader, null, properties);
    17 17   }
    18 18   
    19 19   //通过XMLConfigBuilder解析mybatis配置,然后创建SqlSessionFactory对象
    20 20   public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    21 21     try {
    22 22       XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
    23 23       //下面看看这个方法的源码
    24 24       return build(parser.parse());
    25 25     } catch (Exception e) {
    26 26       throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    27 27     } finally {
    28 28       ErrorContext.instance().reset();
    29 29       try {
    30 30         reader.close();
    31 31       } catch (IOException e) {
    32 32         // Intentionally ignore. Prefer previous error.
    33 33       }
    34 34     }
    35 35   }
    36 36 
    37 37   public SqlSessionFactory build(Configuration config) {
    38 38     return new DefaultSqlSessionFactory(config);
    39 39   }
    40 40 
    41 41 }

    通过源码,我们可以看到SqlSessionFactoryBuilder 通过XMLConfigBuilder 去解析我们传入的mybatis的配置文件,

    下面就接着看看 XMLConfigBuilder 部分源码:

     1  /**
     2  2  * mybatis 配置文件解析
     3  3  */
     4  4 public class XMLConfigBuilder extends BaseBuilder {
     5  5   public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
     6  6     this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
     7  7   }
     8  8 
     9  9   private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
    10 10     super(new Configuration());
    11 11     ErrorContext.instance().resource("SQL Mapper Configuration");
    12 12     this.configuration.setVariables(props);
    13 13     this.parsed = false;
    14 14     this.environment = environment;
    15 15     this.parser = parser;
    16 16   }
    17 17   
    18 18   //外部调用此方法对mybatis配置文件进行解析
    19 19   public Configuration parse() {
    20 20     if (parsed) {
    21 21       throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    22 22     }
    23 23     parsed = true;
    24 24     //从根节点configuration
    25 25     parseConfiguration(parser.evalNode("/configuration"));
    26 26     return configuration;
    27 27   }
    28 28 
    29 29   //此方法就是解析configuration节点下的子节点
    30 30   //由此也可看出,我们在configuration下面能配置的节点为以下10个节点
    31 31   private void parseConfiguration(XNode root) {
    32 32     try {
    33 33       propertiesElement(root.evalNode("properties")); //issue #117 read properties first
    34 34       typeAliasesElement(root.evalNode("typeAliases"));
    35 35       pluginElement(root.evalNode("plugins"));
    36 36       objectFactoryElement(root.evalNode("objectFactory"));
    37 37       objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    38 38       settingsElement(root.evalNode("settings"));
    39 39       environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
    40 40       databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    41 41       typeHandlerElement(root.evalNode("typeHandlers"));
    42 42       mapperElement(root.evalNode("mappers"));
    43 43     } catch (Exception e) {
    44 44       throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    45 45     }
    46 46   }
    47 47 }

    通过以上源码,我们就能看出,在mybatis的配置文件中:

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

    本篇文章就先只介绍这些内容,接下来的文章将依次分析解析这个10个节点中比较重要的几个节点的源码,看看在解析这些节点的时候,到底做了些什么。

  • 相关阅读:
    rt_list_entry() 函数
    替换空格
    跳台阶
    斐波那契数列
    基于5221码的同步十进制加法计数器
    强连通分量+Tarjia+缩点
    次小生成树
    差分约束
    P1547 Out of Hay
    P1197 [JSOI2008]星球大战
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/8996833.html
Copyright © 2020-2023  润新知