MyBatis 3 Java API-SqlSessionFactoryBuilder

2022-04-11 14:04 更新

SqlSessionFactoryBuilder

??SqlSessionFactoryBuilder ??有五個(gè) ?build()? 方法,每一種都允許你從不同的資源中創(chuàng)建一個(gè) ??SqlSessionFactory ??實(shí)例。

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)

第一種方法是最常用的,它接受一個(gè)指向 XML 文件(也就是之前討論的 mybatis-config.xml 文件)的 ??InputStream ??實(shí)例。可選的參數(shù)是 ??environment ??和 ??properties??。??environment ??決定加載哪種環(huán)境,包括數(shù)據(jù)源和事務(wù)管理器。比如:

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

如果你調(diào)用了帶 ??environment ??參數(shù)的 ??build ??方法,那么 MyBatis 將使用該環(huán)境對(duì)應(yīng)的配置。當(dāng)然,如果你指定了一個(gè)無效的環(huán)境,會(huì)收到錯(cuò)誤。如果你調(diào)用了不帶 ??environment ??參數(shù)的 ??build ??方法,那么就會(huì)使用默認(rèn)的環(huán)境配置(在上面的示例中,通過 ??default="development"?? 指定了默認(rèn)環(huán)境)。

如果你調(diào)用了接受 ??properties ??實(shí)例的方法,那么 MyBatis 就會(huì)加載這些屬性,并在配置中提供使用。絕大多數(shù)場(chǎng)合下,可以用 ??${propName}?? 形式引用這些配置值。

回想一下,在 mybatis-config.xml 中,可以引用屬性值,也可以直接指定屬性值。因此,理解屬性的優(yōu)先級(jí)是很重要的。在之前的文檔中,我們已經(jīng)介紹過了相關(guān)內(nèi)容,但為了方便查閱,這里再重新介紹一下:

如果一個(gè)屬性存在于下面的多個(gè)位置,那么 MyBatis 將按照以下順序來加載它們:

  • 首先,讀取在 ??properties ??元素體中指定的屬性;
  • 其次,讀取在 ??properties ??元素的類路徑 ??resource ??或 ??url ??指定的屬性,且會(huì)覆蓋已經(jīng)指定了的重復(fù)屬性;
  • 最后,讀取作為方法參數(shù)傳遞的屬性,且會(huì)覆蓋已經(jīng)從 ??properties ??元素體和 ??resource ??或 ??url ??屬性中加載了的重復(fù)屬性。

因此,通過方法參數(shù)傳遞的屬性的優(yōu)先級(jí)最高,??resource ??或 ??url ??指定的屬性優(yōu)先級(jí)中等,在 ??properties ??元素體中指定的屬性優(yōu)先級(jí)最低。

總結(jié)一下,前四個(gè)方法很大程度上是相同的,但提供了不同的覆蓋選項(xiàng),允許你可選地指定 ??environment ??和??/??或 ??properties??。以下給出一個(gè)從 mybatis-config.xml 文件創(chuàng)建 ??SqlSessionFactory ??的示例:

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

注意,這里我們使用了 ??Resources ??工具類,這個(gè)類在 ??org.apache.ibatis.io?? 包中。??Resources ??類正如其名,會(huì)幫助你從類路徑下、文件系統(tǒng)或一個(gè) web URL 中加載資源文件。在略讀該類的源代碼或用 IDE 查看該類信息后,你會(huì)發(fā)現(xiàn)一整套相當(dāng)實(shí)用的方法。這里給出一個(gè)簡(jiǎn)表:

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)

最后一個(gè) ??build ??方法接受一個(gè) ??Configuration ??實(shí)例。??Configuration ??類包含了對(duì)一個(gè) ??SqlSessionFactory ??實(shí)例你可能關(guān)心的所有內(nèi)容。在檢查配置時(shí),??Configuration ??類很有用,它允許你查找和操縱 SQL 映射(但當(dāng)應(yīng)用開始接收請(qǐng)求時(shí)不推薦使用)。你之前學(xué)習(xí)過的所有配置開關(guān)都存在于 ??Configuration ??類,只不過它們是以 ?Java API? 形式暴露的。以下是一個(gè)簡(jiǎn)單的示例,演示如何手動(dòng)配置 ??Configuration ??實(shí)例,然后將它傳遞給 ??build()?? 方法來創(chuàng)建 ??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);

現(xiàn)在你就獲得一個(gè)可以用來創(chuàng)建 ??SqlSession ??實(shí)例的 ??SqlSessionFactory ??了。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)