SqlSessionFactory和SqlSession簡解
【1】SqlSessionFactoryBuilder
這個類可以被初始化、使用和丟棄,如果你已經建立好了一個SqlSessionFactory 後就不用再保留它。
因此,SqlSessionFactoryBuilder 的最好作用域是方法體內
比如說定義一個方法變數。你可以重複使用SqlSessionFactoryBuilder 生成多個SqlSessionFactory 例項,但是最好不要強行保留,因為XML 的解析資源要用來做其它更重要的事。
【2】SqlSessionFactory
一旦建立,SqlSessionFactory 就會在整個應用過程中始終存在。所以沒有理由去銷燬和再建立它,一個應用執行中也不建議多次建立SqlSessionFactory。
因此SqlSessionFactory最好的作用域是Application。
可以有多種方法實現。最簡單的方法是單例模式或者是靜態單例模式。然而這既不是廣泛贊成和好用的。
反而,使用Google Guice 或Spring 來進行依賴反射會更好。這些框架允許你生成管理器來管理SqlSessionFactory 的單例生命週期。
【3】SqlSession
每個執行緒都有自己的SqlSession 例項,SqlSession 例項是不能被共享,也不是執行緒安全的。
因此最好使用Request 作用域或者方法體作用域。
不要使用類的靜態變數來引用一個SqlSession 例項,甚至不要使用類的一個例項變數來引用。
永遠不要在一個被管理域中引用SqlSession
比如說在Servlet 中的HttpSession 中。如果你正在使用WEB 框架,應該讓SqlSession 跟隨HTTP 請求的相似作用域。也就是說,在收到一個HTTP 請求過後,開啟SqlSession,等返回一個迴應以後,立馬關掉這個SqlSession。
關閉SqlSession 是非常重要的,你必須要確保SqlSession 在finally 方法體中正常關閉。
【4】對映器例項
對映器是你建立繫結對映語句的介面–mapper,對映器介面的例項可以從sqlSession中獲得。
那麼從技術上來說,對映器例項的最寬範圍和sqlSession是相同的。
然而對映器例項的最佳範圍是方法範圍!
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
//BlogMapper 是註解dao介面
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
}finally{
sqlSession.close();
}
【5】建立SQLSessionFactory的幾種方式
① 使用resource and reader
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
② 使用InputStream
String resource = "mybatis.xml";
/*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!!
* please distinguish the two up and down
* */
InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);