《MyBatis用戶指南》----Part 2

P8


關於命名空間的提示

è命名空間在前面的例子中是可選的,也是令人糊塗和沒有益處的。現在是需要命名空間的,它的目的不僅僅是用長長的全限定名字來隔離語句。
   如你所見,命名空間使綁定接口成爲可能,即使你認爲現在不會用到它們,但你仍然應該遵從這些實踐以防你將來改變主意。一次使用命名空間、把它放在一個合適的Java包命名空間中,會使你的代碼整潔、乾淨,在相當長的時間內,提高MyBatis的可用性。

è名字解析:爲了減少輸入量,MyBatis爲命名配置元素,包括語句,結果映射,緩存等等使用如下的名字解析方案:
   會直接查找全限定名(如“com.mypackage.MyMapper.selectAllThings”),如果存在就使用。
   短名(如“selectAllThings”)會被直接用來引用無歧義的項。但如果有兩個以上的短名(如“com.foo.selectAllThings 、 com.bar.selectAllThings”),程序會拋出一個錯誤,告訴你這個短名有歧義,必須使用全限定名。
  
   對於映射者類(Mapper)如BlogMapper,還有一個容易迷惑的地方。它們的映射語句可以根本不用xml。相反它們可以使用Java註解。比如,上面的xml可以替換成如下的內容:
     
P9
  對於簡單的語句,這個註解非常簡潔,但是,Java註解不僅功能上有限制而且對於複雜的語句會顯得非常亂。如果你需要處理複雜的情況,最好使用xml映射語句。
  哪個對你是對的、映射語句定義成一致的方式對你們有多重要,這取決於你和你的項目組。也就是說,永遠不要把自己鎖定到一種方式。你能夠非常容易地把xml映射語句遷移到註解上,反之亦然。
 
作用域和生命週期
   理解我們討論過的多種作用域和生命週期類是非常重要的,錯誤的使用會導致嚴重的併發問題。
  
SqlSessionFactoryBuilder
  這個類可以被初始化、使用然後丟棄。一旦你創建了SqlSessionFactory,就沒有必要再保存SqlSessionFactoryBuilder。因此,它的實例的最好作用域就是方法作用域(如一個本地方法變量)。可以使用SqlSessionFactoryBuilder創建多個SqlSessionFactory實例,但最好不要保存SqlSessionFactoryBuilder實例,以確保爲了更重要的事情,所有xml解析資源都是可用的。
 
SqlSessionFactory
  一旦創建,SqlSessionFactory應該存在於整個應用程序的執行期。極少有或根本沒有理由去銷燬或重建它。最佳實踐是在一個程序運行期中,避免多次重建SqlSessionFactory,那麼做是非常“噁心的”。因此SqlSessionFactory的作用域最好是應用程序作用域。有好幾種辦法可以做到這點。最簡單的一種是使用單例或靜態單例模式。但是,這二者沒有一個是作爲最佳實踐而被廣泛接受的。相反,你也許更喜歡研究一下依賴注入容器,如Google Guide或Spring。這樣的框架允許你創建提供者來管理SqlSessionFactory單例生命週期。
 
SqlSession
  每個線程都應該有自己的SqlSession實例。SqlSession實例不會共享,而且也不是線程安全的。因此最好的作用域是請求(request scope)或方法作用域。永遠不要在類的靜態字段甚至實例字段保持SqlSession實例的引用。永遠不要在任何受管理域,如Servlet框架的HttpSession,保持SqlSession實例的引用。如果正在使用任何web框架,請考慮使用與HTTP request相似的作用域(譯者注:原文是consider the SqlSession to follow a similar scope to that of an HTTP request,實在看的有些不知所云,但基本意思應該和我說的一樣)。換句話說,收到HTTP請求時,可以打開一個SqlSession,當返回響應的時候,關閉這個SqlSession。關閉SqlSession非常重要。應確保在finally語句塊中關閉它。下面是一個確保SqlSession被關閉的標準模式:
   

 
P10
  如此一直使用可以確保所有數據庫資源被正確地關閉掉(假定你之前沒有使用過自己的連接用來告訴MyBatis你想自己管理連接資源)。
 
映射者實例
  映射者是用來綁定映射語句的一組接口。映射者接口的實例可以從SqlSession獲得。這樣的話,從理論上來說,它的實例作用域和發出請求的SqlSession是一樣的。也就是說,它們應該在應該使用的方法裏被請求,然後廢棄。不必顯式關閉它們。在一個請求中不必保持這些實例,和SqlSession是類似的,你會發現如果在這個級別上管理太多資源,事情很快便會無法控制。保持簡單,在方法作用域中保持映射者。下面的例子說明了這點。

 
映射者xml配置 
  MyBatis配置文件包含了擁有強大能力的設置和屬性。下面是xml文檔的高級結構:

· configuration

properties

settings

typeAliases

typeHandlers

objectFactory

plugins

environments

§ environment

· transactionManager

· dataSource

mappers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章