1. 程式人生 > >Mybatis 系列2

Mybatis 系列2

tsql 靈活性 database 靈活 except factor tin ext inpu

上篇文章 寫了一個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個節點中比較重要的幾個節點的源碼,看看在解析這些節點的時候,到底做了些什麽。

Mybatis 系列2