Mybatis series (2) --- Configuration Introduction (mybatis source code)

In the last article " Mybatis Series (1) --- Getting Started with Mybatis ", I wrote a Demo that briefly reflects the process of Mybatis. This time, I will briefly introduce the configuration file of Mybatis:

In the last example, we used SqlSessionFactoryBuilder to create SqlSessionFactory, then, let's start with SqlSessionFactoryBuilder, let's see how the source code is implemented:

SqlSessionFactoryBuilder source code snippet:

copy code
1  public  class SqlSessionFactoryBuilder {
 2  
3    // Reader reads the mybatis configuration file and passes in the construction method
 4    // In addition to Reader, there is actually a construction method with the corresponding inputStream as a parameter,
 5    // This also reflects the flexibility of mybatis configuration 
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 configuration file + properties, at this time, properties can not be configured in mybatis configuration file, or you can use ${} form 
15    public SqlSessionFactory build(Reader reader, Properties properties) {
 16      return build(reader, null , properties);
 17    }
 18    
19    // Parse the mybatis configuration through XMLConfigBuilder, and then create the SqlSessionFactory object 
20    public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
 21      try {
 22        XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
 23        / / Look at the source code of this method below 
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 }
copy code

Through the source code, we can see that SqlSessionFactoryBuilder parses the configuration file of mybatis we passed in through XMLConfigBuilder. Let's take a look at the XMLConfigBuilder part of the source code:

copy code
 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 }
copy code

Through the above source code, we can see that in the configuration file of mybatis:

1. The configuration node is the root node.

2. Under the configuration node, we can configure 10 sub-nodes, namely: properties, typeAliases, plugins, objectFactory, objectWrapperFactory, settings, environments, databaseIdProvider, typeHandlers, mappers.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326989295&siteId=291194637