zoukankan      html  css  js  c++  java
  • 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)

    上篇文章《深入浅出Mybatis系列(一)---Mybatis入门》, 写了一个Demo简单体现了一下Mybatis的流程。本次,将简单介绍一下Mybatis的配置文件:

    上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSessionFactory,  那么,我们就先从SqlSessionFactoryBuilder入手, 咱们先看看源码是怎么实现的:

    SqlSessionFactoryBuilder源码片段:

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

    通过源码,我们可以看到SqlSessionFactoryBuilder 通过XMLConfigBuilder 去解析我们传入的mybatis的配置文件, 下面就接着看看 XMLConfigBuilder 部分源码:

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

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

    1. configuration节点为根节点。

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

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

    原文链接:http://www.cnblogs.com/dongying/p/4031613.html

  • 相关阅读:
    Codeforces977D ---Divide by three, multiply by two 深搜+map存出现的数
    HDU4522 湫湫系列故事——过年回家
    2018浙江省赛记录
    POJ3259 :Wormholes(SPFA判负环)
    上海高校金马五校赛 F题:1 + 2 = 3?
    牛客练习赛15A-吉姆的运算式(Python正则表达式瞎搞)
    ZOJ2018/4月月赛G题Traffic Light(广搜)
    luogu 3960 列队
    noip2017
    10.3 模拟赛
  • 原文地址:https://www.cnblogs.com/jerrylz/p/5486308.html
Copyright © 2011-2022 走看看