MyBatis 3 Java API-SqlSessionFactoryBuilder

2022-04-11 14:04 更新

SqlSessionFactoryBuilder

??SqlSessionFactoryBuilder ??有五個 ?build()? 方法,每一種都允許你從不同的資源中創(chuàng)建一個 ??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 文件(也就是之前討論的 mybatis-config.xml 文件)的 ??InputStream ??實例。可選的參數(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)境對應(yīng)的配置。當然,如果你指定了一個無效的環(huán)境,會收到錯誤。如果你調(diào)用了不帶 ??environment ??參數(shù)的 ??build ??方法,那么就會使用默認的環(huán)境配置(在上面的示例中,通過 ??default="development"?? 指定了默認環(huán)境)。

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

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

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

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

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

總結(jié)一下,前四個方法很大程度上是相同的,但提供了不同的覆蓋選項,允許你可選地指定 ??environment ??和??/??或 ??properties??。以下給出一個從 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 ??工具類,這個類在 ??org.apache.ibatis.io?? 包中。??Resources ??類正如其名,會幫助你從類路徑下、文件系統(tǒng)或一個 web URL 中加載資源文件。在略讀該類的源代碼或用 IDE 查看該類信息后,你會發(fā)現(xià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)

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



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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號