SQLSessionFactoryBuilder
SQLSessionFactoryBuilder是利用XML或者Java編碼獲得資源來構建SqlSessionFactory的,通過它可以構建多個SessionFactory。它的作用就是一個構建器,一旦構建了SqlSessionFactory,它的作用就已經完結,失去了存在的意義,這時我們就應該毫不猶豫的廢棄它,將它回收。所以它的生命週期只存在於方法的局部,它的作用是生成SqlSessionFactory對象。
SqlSessionFactory
SqlSessionFactory的作用是創建SqlSession。每次應用程序需要訪問數據庫,我們就要通過SqlSessionFactory創建SqlSession,所以SqlSessionFactory應該在MyBatis應用的整個生命週期中。而如果我們多次創建同一個數據庫的SqlSessionFactory,則每次創建SqlSessionFactory會打開更多的數據庫連接,那麼連接資源就很快被耗盡,因此SqlSessionFactory的責任是唯一的,它的責任就是創建SqlSession,所以我們採用單例模式。
SqlSession
SqlSession是一個會話,它的生命週期應該在請求數據庫處理事務的過程中。它是一個線程不安全的對象。每次創建的SqlSession都必須及時關閉它,它長期存在就會使數據庫連接池的活動資源減少,對系統的性能影響很大。因此常在finally塊關閉SqlSession。它存活於一個應用的請求和操作,可以執行多條SQL,保證事務的一致性。
Mapper
Mapper是一個接口,而沒有任何實現類,它的作用是發送SQL,然後返回我們需要的結果,或者執行SQL從而修改數據庫的數據,因此它應該在一個SqlSession事務方法之內,是一個方法級別的東西。
以下是創建SqlSessionFactory以及SqlSession的方法:
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory = null;
private SqlSessionFactoryUtil() {
}
//雙重檢查方式實現單例
public static SqlSessionFactory getInstance() {
String resource = "mybatis-config.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
if (sqlSessionFactory == null) {
// 添加了一個類鎖
synchronized (SqlSessionFactoryUtil.class) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return sqlSessionFactory;
}
/**
* 打開SqlSession
*/
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
sqlSessionFactory = getInstance();
}
return sqlSessionFactory.openSession();
}
}
參考文獻:
深入淺出MyBatis技術原理與實戰