
目錄
1. 使用何種映射器配置
MyBatis 3之后的SQL語句映射既支持注解也支持XML配置,他們各有優勢和缺點,在實例項目中應該如何選擇可以參考如下建議:
對於簡單語句來說,注解使代碼顯得更加簡潔,然而Java注解對於稍微復雜的語句就會力不從心並且會顯得更加混亂。因此,如果你需要做很復雜的事情,那么最好使用XML來映射語句。當然,可以在項目中同時使用基於注解和基於XML配置2種形式的SQL語句映射,MyBatis是支持的。
2. 對象生命周期和作用域
SqlSessionFactoryBuilder
這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源釋放給更重要的事情。
SqlSessionFactory
SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創建多次,多次重建 SqlSessionFactory 被視為一種代碼”壞味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是應用作用域。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。在Spring框架中集成MyBatis時,SqlSessionFactory實例的生命周期由Spring框架管理,不用開發者過多操心。
SqlSession
每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此不能被共享,所以它的最佳的作用域是請求或方法作用域。絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。也絕不能將 SqlSession 實例的引用放在任何類型的管理作用域中,比如 Servlet 架構中的 HttpSession。如果你現在正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象相似的作用域中。換句話說,每次收到的 HTTP 請求,就可以打開一個 SqlSession,返回一個響應,就關閉它。這個關閉操作是很重要的,你應該把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。下面的示例就是一個確保 SqlSession 關閉的標准模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
在你的所有代碼中一致性地使用這種模式來保證所有數據庫資源都能被正確地關閉。
映射器實例(Mapper Instances)
映射器是創建用來綁定映射語句的接口。映射器接口的實例是從 SqlSession 中獲得的。因此從技術層面講,映射器實例的最大作用域是和 SqlSession 相同的,因為它們都是從 SqlSession 里被請求的。盡管如此,映射器實例的最佳作用域是方法作用域。也就是說,映射器實例應該在調用它們的方法中被請求,用過之后即可廢棄。並不需要顯式地關閉映射器實例,盡管在整個請求作用域(request scope)保持映射器實例也不會有什么問題,但是很快你會發現,像 SqlSession 一樣,在這個作用域上管理太多的資源的話會難於控制。所以要保持簡單,最好把映射器放在方法作用域(method scope)內。下面的示例就展示了這個實踐:
SqlSession session = sqlSessionFactory.openSession();
try {
// 從SqlSession中獲取映射器接口實例
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
