SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许你从不同的资源中创建一个 SqlSession 实例。

  1. SqlSessionFactory build(InputStream inputStream)
  2. SqlSessionFactory build(InputStream inputStream, String environment)
  3. SqlSessionFactory build(InputStream inputStream, Properties properties)
  4. SqlSessionFactory build(InputStream inputStream, String env, Properties props)
  5. SqlSessionFactory build(Configuration config)

第一种方法是最常用的,它使用了一个参照了 XML 文档或上面讨论过的更特定的 mybatis-config.xml 文件的 Reader 实例。可选的参数是 environment 和 properties。environment 决定加载哪种环境,包括数据源和事务管理器。比如:

  1. <environments default="development">
  2. <environment id="development">
  3. <transactionManager type="JDBC">
  4. ...
  5. <dataSource type="POOLED">
  6. ...
  7. </environment>
  8. <environment id="production">
  9. <transactionManager type="MANAGED">
  10. ...
  11. <dataSource type="JNDI">
  12. ...
  13. </environment>
  14. </environments>

如果你调用了参数有 environment 的 build 方法,那么 MyBatis 将会使用 configuration 对象来配置这个 environment。当然,如果你指定了一个不合法的 environment,你就会得到错误提示。如果你调用了不带 environment 参数的 build 方法,那么就使用默认的 environment(在上面的示例中指定为 default="development" 的代码)。

如果你调用了参数有 properties 实例的方法,那么 MyBatis 就会加载那些 properties(属性配置文件),并在配置中可用。那些属性可以用${propName} 语法形式多次用在配置文件中。

回想一下,属性可以从 mybatis-config.xml 中被引用,或者直接指定它。因此理解优先级是很重要的。我们在文档前面已经提及它了,但是这里要再次重申:


如果一个属性存在于这些位置,那么 MyBatis 将会按照下面的顺序来加载它们:

  • 首先读取在 properties 元素体中指定的属性;
  • 其次,读取从 properties 元素的类路径 resource 或 url 指定的属性,且会覆盖已经指定了的重复属性;
  • 最后,读取作为方法参数传递的属性,且会覆盖已经从 properties 元素体和 resource 或 url 属性中加载了的重复属性。

因此,通过方法参数传递的属性的优先级最高,resource 或 url 指定的属性优先级中等,在 properties 元素体中指定的属性优先级最低。


总结一下,前四个方法很大程度上是相同的,但是由于覆盖机制,便允许你可选地指定 environment 和/或 properties。以下给出一个从 mybatis-config.xml 文件创建 SqlSessionFactory 的示例:

  1. String resource = "org/mybatis/builder/mybatis-config.xml";
  2. InputStream inputStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  4. SqlSessionFactory factory = builder.build(inputStream);

注意到这里我们使用了 Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类正如其名,会帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。看一下这个类的源代码或者通过你的 IDE 来查看,就会看到一整套相当实用的方法。这里给出一个简表:

  1. URL getResourceURL(String resource)
  2. URL getResourceURL(ClassLoader loader, String resource)
  3. InputStream getResourceAsStream(String resource)
  4. InputStream getResourceAsStream(ClassLoader loader, String resource)
  5. Properties getResourceAsProperties(String resource)
  6. Properties getResourceAsProperties(ClassLoader loader, String resource)
  7. Reader getResourceAsReader(String resource)
  8. Reader getResourceAsReader(ClassLoader loader, String resource)
  9. File getResourceAsFile(String resource)
  10. File getResourceAsFile(ClassLoader loader, String resource)
  11. InputStream getUrlAsStream(String urlString)
  12. Reader getUrlAsReader(String urlString)
  13. Properties getUrlAsProperties(String urlString)
  14. Class classForName(String className)

最后一个 build 方法的参数为 Configuration 实例。configuration 类包含你可能需要了解 SqlSessionFactory 实例的所有内容。Configuration 类对于配置的自查很有用,它包含查找和操作 SQL 映射(当应用接收请求时便不推荐使用)。作为一个 Java API 的 configuration 类具有所有配置的开关,这些你已经了解了。这里有一个简单的示例,教你如何手动配置 configuration 实例,然后将它传递给 build() 方法来创建 SqlSessionFactory。

  1. DataSource dataSource = BaseDataTest.createBlogDataSource();
  2. TransactionFactory transactionFactory = new JdbcTransactionFactory();
  3.  
  4. Environment environment = new Environment("development", transactionFactory, dataSource);
  5.  
  6. Configuration configuration = new Configuration(environment);
  7. configuration.setLazyLoadingEnabled(true);
  8. configuration.setEnhancementEnabled(true);
  9. configuration.getTypeAliasRegistry().registerAlias(Blog.class);
  10. configuration.getTypeAliasRegistry().registerAlias(Post.class);
  11. configuration.getTypeAliasRegistry().registerAlias(Author.class);
  12. configuration.addMapper(BoundBlogMapper.class);
  13. configuration.addMapper(BoundAuthorMapper.class);
  14.  
  15. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  16. SqlSessionFactory factory = builder.build(configuration);

现在你就获得一个可以用来创建 SqlSession 实例的 SqlSessionFactory 了!