MyBatis核心對象

MyBatis 有三個基本要素:

  • 核心接口和類

  • MyBatis核心配置文件(mybatis-config.xml)

  • SQL映射文件(mapper.xml)

下面首先介紹 MyBatis 的核心接口和類,如下所示。

MyBatis 的核心接口和類
MyBatis 的核心接口和類

每個 MyBatis 應用程序都以一個 SqlSessionFactory 對象的實例為核心。

首先獲取 SqlSessionFactoryBuilder 對象,可以根據(jù) XML 配置文件或者 Configuration 類的實例構建該對象。

然后獲取 SqlSessionFactory 對象,該對象實例可以通過 SqlSessionFactoryBuilder 對象來獲取。

有了 SqlSessionFactory 對象之后,就可以進而獲取 SqlSession 實例。SqlSession 對象中完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行 SQL 操作的方法,用該實例可以直接執(zhí)行已映射的 SQL 語句。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 會根據(jù)配置信息或者代碼生成 SqlSessionFactory,并且提供了多個 build() 方法重載,如圖。

SqlSessionFactoryBuilder
SqlSessionFactoryBuilder

通過源碼分析,可以發(fā)現(xiàn)以上方法都是在調(diào)用同一簽名方法,即:

build(Reader reader, String environment, Properties properties)
                

由于參數(shù) environment 和 properties 都可以為 null,去除重復的方法,真正的重載方法其實只有如下三種:

  • build(InputStream inputStream, String environment, Properties properties)

  • build(Reader reader, String environment, Properties properties)

  • build(Configuration config)

通過上述分析,發(fā)現(xiàn)配置信息可以以三種形式提供給 SqlSessionFactoryBuilder 的 build() 方法,分別是 InputStream(字節(jié)流)、Reader(字符流)、Configuration(類)。

由于字節(jié)流和字符流都屬于讀取配置文件的方式,所以就很容易想到構建一個 SqlSessionFactory 有兩種方式,即:讀取 XML 配置文件和編寫代碼。一般習慣為采取 XML 配置文件的方式來構造 SqlSessionFactory,這樣一方面可以避免硬編碼,另一方面方便日后配置人員修改,避免重復編譯代碼。

SqlSessionFactoryBuilder的生命周期和作用域

SqlSessionFactoryBuilder 的最大特點就是用過即丟。創(chuàng)建 SqlSessionFactory 對象之后,這個類就不存在了,因此 SqlSessionFactoryBuilder 的最佳范圍就是存在于方法體內(nèi),也就是局部變量。

SqlSessionFactory

SqlSessionFactory 是工廠接口而不是現(xiàn)實類,他的任務就是創(chuàng)建 SqlSession。

所有的 MyBatis 應用都以 SqlSessionFactory 實例為中心,SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 對象來獲取。有了它以后,顧名思義,就可以通過 SqlSession 提供的 openSession() 方法來獲取 SqlSession 實例。源碼如下。

public interface SqlSessionFactory {
    SqlSession openSession();
    SqlSession openSession(boolean autoCommit);
    SqlSession openSession(Connection connection);
    SqlSession openSession(TransactionIsolationLevel level);
    SqlSession openSession(ExecutorType execType);
    SqlSession openSession(ExecutorType execType, boolean autoCommit);
    SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
    SqlSession openSession(ExecutorType execType, Connection connection);
    Configuration getConfiguration();
}
                

SqlSessionFactory的生命周期和作用域

SqlSessionFactory 對象一旦創(chuàng)建,就會在整個應用程序過程中始終存在。沒有理由去銷毀或再創(chuàng)建它,并且在應用程序運行中也不建議多次創(chuàng)建 SqlSessionFactory。因此 SqlSessionFactory 的最佳作用域是 Application,即隨著應用程序的生命周期一直存在。這種“存在于整個應用運行期間,并且只存在一個對象實例”的模式就是所謂的單例模式(指在運行期間有且僅有一個實例)。

SqlSession

SqlSession 是用于執(zhí)行持久化操作的對象,類似于 JDBC 中的 Connection。它提供了面向數(shù)據(jù)庫執(zhí)行 SQL 命令所需的所有方法,可以通過 SqlSession 實例直接運行已映射的 SQL 語句。

void clearCache();
Configuration getConfiguration();
void rollback(boolean force);
void commit(boolean force);
int delete(String statement, Object parameter);
...
                

SqlSession 的用途主要有兩種。

  • 獲取映射器。讓映射器通過命名空間和方法名稱找到對應的 SQL,并發(fā)送給數(shù)據(jù)庫,執(zhí)行后返回結果。

  • 直接通過“命名空間(namespace)+SQL id”的方式執(zhí)行 SQL,不需要獲取映射器。這是 iBatis 版本留下的方式。例如《第一個MyBatis程序》一節(jié)的示例就是這種方式執(zhí)行的 SQL 語句。

SqlSession生命周期和作用域

SqlSession 對應一次數(shù)據(jù)庫會話。由于數(shù)據(jù)庫會話不是永久的,因此 SqlSession 的生命周期也不是永久的,每次訪問數(shù)據(jù)庫時都需要創(chuàng)建 SqlSession 對象。

需要注意的是:每個線程都有自己的 SqlSession 實例,SqlSession 實例不能被共享,也不是線程安全的。因此 SqlSession 的作用域范圍是 request 作用域或方法體作用域內(nèi)。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清