MyBatis 教程

MyBatis SqlSessionFactoryBuilder 类

注意:SqlSessionFactoryBuilder 这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需要存在了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好的方式是不需要保持它一直存在来保证所有 XML 解析资源,因为还有更重要的事情要做。

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

SqlSessionFactory build(Reader reader)
SqlSessionFactory build(Reader reader, String environment)
SqlSessionFactory build(Reader reader, Properties properties)
SqlSessionFactory build(Reader reader, String env, Properties props)
SqlSessionFactory build(Configuration config)

第一种方法是最常用的,它使用了一个 mybatis-cfg.xml 文件的 Reader 实例。参数 environment 和 properties 是可选的。Environment 决定了加载哪种环境,包括数据源和事务管理器。比如:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC">
        …
        </transactionManager>
        <dataSource type="POOLED">
        …
        </dataSource>
    </environment>
    <environment id="production">
        <transactionManager type="EXTERNAL">
        …
        </transactionManager>
        <dataSource type="JNDI">
        …
        </dataSource>
    </environment>
</environments>

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

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

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

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

  • 首先读取 <properties> 元素体中指定的属性;

  • 其次读取 <properties> 元素 resource 或 url 属性指定的属性文件内容,可以覆盖已经指定的重复属性

  • 最后读取作为方法参数传递的属性,可以覆盖已经从 <properties> 元素体和 resource/url 属性中加载的任意重复属性

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

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

String resource = "org/mybatis/builder/MapperConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);

注意这里我们使用了 Resources 工具类,这个类在 org.mybatis.io 包中。Resources 类正如其名,会帮助你从类路径下,文件系统或一个 web 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);

现在你有一个 SqlSessionFactory,可以用来创建 SqlSession 实例。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号