核心配置文件mysql
configuration(配置) properties(屬性) settings(設置) typeAliases(類型別名) typeHandlers(類型處理器) objectFactory(對象工廠) plugins(插件) environments(環境配置) environment(環境變量) transactionManager(事務管理器) dataSource(數據源) databaseIdProvider(數據庫廠商標識) mappers(映射器)
environments元素sql
MyBatis能夠配置多套運行環境,將SQL映射到不一樣的數據庫上,但只能指定一個來運行,經過default來指定數據庫
子元素節點:environment服務器
dataSource元素使用標準的JDBC數據源接口來配置JDBC鏈接對象的資源,數據源是必須配置的,type可選參數以下:mybatis
transactionManager 事務管理器併發
property 數據庫鏈接設置app
具體環境靠id進行區分,id保證惟一!ide
mappers元素優化
引入資源方式ui
Mapper文件
Properties優化
數據庫這些屬性都是可外部配置且可動態替換的,既能夠在典型的 Java 屬性文件中配置,亦可經過 properties 元素的子元素來傳遞。
優化MyBatis核心配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?Unicode=true&characterEncoding=utf8 username=root password=1234
-->
注意:配置文件的配置參數是有優先級的,優先級順序以下,若是不知道,能夠經過IDEA報錯提醒。
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
typeAliases
類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,意在下降冗餘的全限定類名書寫。
這樣配置時,就可使用 User 代替任何 com.bg.pojo.User
也能夠指定一個包名,MyBatis會在包名下面搜索須要的Java Bean,好比:
每個在包 com.bg.pojo 中的Java Bean,在沒有註解的狀況下,會使用 Bean 的首字母小寫的非限定類名來做爲它的別名。。例如,user 做爲 com.bg.pojo.User 的別名。
如有註解,則別名爲其註解值,以下:
@Alias("user") public class User { ... }
設置(settings)
這是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲。具體參數含義參考官方文檔。
一個配置完整的 settings 元素的示例以下:
類型處理器(typeHandlers)
MyBatis 在設置預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉換成 Java 類型。
對象工廠(objectFactory)
每次 MyBatis 建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工做。 默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認無參構造方法,要麼經過存在的參數映射來調用帶有參數的構造方法。
生命週期和做用域
理解咱們以前討論過的不一樣做用域和生命週期類別是相當重要的,由於錯誤的使用會致使很是嚴重的併發問題。
首先經過流程圖,分析下MyBatis的執行過程:
做用域理解:
SqlSessionFactoryBuilder 的做用在於建立 SqlSessionFactory,建立成功後,SqlSessionFactoryBuilder 就失去了做用,因此它只能存在於建立 SqlSessionFactory 的方法中,而不要讓其長期存在。所以 SqlSessionFactoryBuilder 實例的最佳做用域是方法做用域(也就是局部方法變量)。
SqlSessionFactory 能夠被認爲是一個數據庫鏈接池,它的做用是建立 SqlSession 接口對象。由於 MyBatis 的本質就是 Java 對數據庫的操做,因此 SqlSessionFactory 的生命週期存在於整個 MyBatis 的應用之中,因此一旦建立了 SqlSessionFactory,就要長期保存它,直至再也不使用 MyBatis 應用,因此能夠認爲 SqlSessionFactory 的生命週期就等同於 MyBatis 的應用週期。
因爲 SqlSessionFactory 是一個對數據庫的鏈接池,因此它佔據着數據庫的鏈接資源。若是建立多個 SqlSessionFactory,那麼就存在多個數據庫鏈接池,這樣不利於對數據庫資源的控制,也會致使數據庫鏈接資源被消耗光,出現系統宕機等狀況,因此儘可能避免發生這樣的狀況。
所以在通常的應用中咱們每每但願 SqlSessionFactory 做爲一個單例,讓它在應用中被共享。因此說 SqlSessionFactory 的最佳做用域是應用做用域。
若是說 SqlSessionFactory 至關於數據庫鏈接池,那麼 SqlSession 就至關於一個數據庫鏈接(Connection 對象),你能夠在一個事務裏面執行多條 SQL,而後經過它的 commit、rollback 等方法,提交或者回滾事務。因此它應該存活在一個業務請求中,處理完整個請求後,應該關閉這條鏈接,讓它歸還給 SqlSessionFactory,不然數據庫資源就很快被耗費精光,系統就會癱瘓,因此用 try...catch...finally... 語句來保證其正確關閉。因此 SqlSession 的最佳的做用域是請求或方法做用域。