在MyBatis中,用于与数据库进行交互的主要Java接口是SqlSession。通过这个接口,您可以执行命令、获取映射器并管理事务。稍后我们将更详细地讨论SqlSession本身,但首先我们必须学习如何获取SqlSession的实例。SqlSession是由SqlSessionFactory实例创建的。SqlSessionFactory包含了各种创建SqlSession实例的方法。SqlSessionFactory本身是由SqlSessionFactoryBuilder创建的,可以从XML、注解或手动编写的Java配置创建SqlSessionFactory。
注意:当使用Spring或Guice等依赖注入框架与MyBatis结合使用时,SqlSession会由DI框架创建和注入,因此您无需使用SqlSessionFactoryBuilder或SqlSessionFactory,可以直接进入到SqlSession部分。请参考MyBatis-Spring或MyBatis-Guice手册以获得更多信息。
SqlSessionFactoryBuilder提供了五种不同的build()方法,每种方法都允许您从不同的来源构建SqlSessionFactory。
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
前四种方法是最常见的,因为它们接受一个指向XML文档的InputStream实例,或者更具体地说,是上面提到的mybatis-config.xml文件。可选参数是environment和properties。environment确定要加载的环境,包括数据源和事务管理器。例如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
...
<dataSource type="POOLED">
...
</environment>
<environment id="production">
<transactionManager type="MANAGED">
...
<dataSource type="JNDI">
...
</environment>
</environments><environments default="development">
<environment id="development">
<transactionManager type="JDBC">
...
<dataSource type="POOLED">
...
</environment>
<environment id="production">
<transactionManager type="MANAGED">
...
<dataSource type="JNDI">
...
</environment>
</environments>
如果调用了带有environment参数的build方法,MyBatis将使用该环境的配置。当然,如果指定了一个无效的环境,将会收到错误消息。如果调用不带environment参数的build方法之一,将使用默认环境(在上面的示例中指定为default="development")。
如果调用了接受Properties实例的方法,MyBatis将加载这些属性,并使其在配置中可用。您可以使用${propName}的语法,在配置中使用这些属性替代大多数值。
请记住,属性还可以从mybatis-config.xml文件中引用,或直接在其中指定。因此,了解优先级是非常重要的。我们在本文档中之前提到过它,但为了方便参考,这里再次列出:
如果一个属性在这些位置中的多个地方都存在,MyBatis按以下顺序加载它们。
因此,最高优先级的属性是作为方法参数传递的属性,其次是resource/url属性,最后是在properties元素体内指定的属性。
总结一下,前面四种方法在很大程度上是相同的,只是在允许您选择性地指定环境和/或属性时进行了覆盖。下面是从mybatis-config.xml文件构建SqlSessionFactory的示例:?
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
?请注意,我们正在使用 ?Resources
?实用类,它位于 ?org.apache.ibatis.io
?包中。?Resources
?类顾名思义,帮助您从类路径、文件系统甚至网络URL加载资源。快速查看该类的源代码或通过IDE进行检查将揭示其一系列明显有用的方法。以下是一个快速列表:
URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)
最后一个 ?build()
?方法接受一个 ?Configuration
?实例作为参数。?Configuration
?类包含了关于 ?SqlSessionFactory
?实例的所有可能需要了解的内容。?Configuration
?类对于内部检查配置非常有用,包括查找和操作SQL映射(不推荐在应用程序接受请求之后进行操作)。?Configuration
?类提供了之前学到的每个配置开关,只是以Java API的形式暴露出来。以下是一个简单示例,展示如何手动创建一个 ?Configuration
?实例,并将其传递给 ?build()
?方法来创建一个 ?SqlSessionFactory
?。
DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.setLazyLoadingEnabled(true);
configuration.setEnhancementEnabled(true);
configuration.getTypeAliasRegistry().registerAlias(Blog.class);
configuration.getTypeAliasRegistry().registerAlias(Post.class);
configuration.getTypeAliasRegistry().registerAlias(Author.class);
configuration.addMapper(BoundBlogMapper.class);
configuration.addMapper(BoundAuthorMapper.class);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);
现在您拥有一个可以用于创建 ?SqlSession
?实例的 ?SqlSessionFactory
?了。