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:
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 }
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:
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 }
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.