Mybatis源碼分析(三):Mybatis所有暴露的介面及其作用
上節我們主要簡單介紹了mybatis的源碼入口,其中講到了一個核心的類
SqlSessionFactoryBean,這個類中有很多屬性,我們最常用的就是mapperLocations【掃描所有的xml文件】和mapperLocations【數據源配置】
這裡我們結合buildSqlSessionFactory()【相關屬性的處理方法】方法來看看相關的屬性【方法中的屬性就是mybatis所暴露給用戶的全部介面】
注意:
Mybatis的SqlSessionFactoryBean這些屬性實際上是mybatis所暴露出的介面,方便我們對mybatis進一步擴展!
本節主要描述下mybatis相關屬性的作用,下節開始對常用屬性進一步擴展!
1.configLocation
classpath*:核心配置文件的位置
用來配置mybatis的核心配置文件,配置文件的格式如下:
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
也就是說SqlSessionFactoryBean下很多屬性可以配置到mybatis的全局配置文件中!
2.objectFactory
上圖可見objectFactory屬性在代碼中的位置
這個元素,大家在使用mybatis的時候設置嗎?我是從來沒有設置過啊。使用mybatis為我們已經寫好的默認實現已經能夠滿足絕大多數的場景需求。那麼這個元素又是幹什麼的呢?
官方文檔上是這麼說的:
MyBatis 每次創建結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成。 默認的對象工廠需要做的僅僅是實例化目標類,要麼通過默認構造方法,要麼在參數映射存在的時候通過參數構造方法來實例化。 如果想覆蓋對象工廠的默認行為,則可以通過創建自己的對象工廠來實現。注意的是mybatis為我們實現了一個默認實現,那就是DefaultObjectFactory,這個已經足夠我們使用了。
3. objectWrapperFactory
(源碼中被處理的位置)
上圖是objectWrapperFactory配置被解析在源碼中的位置
Spring中配置
"objectWrapperFactory"ref="定義的處理類"/>,這樣的配置就會被上段代碼所解析!(以下提到的各個屬性在spring配置文件中的配置基本類似)
作用:mybatis 對基本類型,基本對象,map和集合的包裝,除非你有比較特殊的對象需要自己實現,才有用到這個配置。所以這個類的作用是獲取或設置bean,map或者list屬性的值。
objectWrapperFactory源碼
MetaObject的源碼
它有一個默認的實現類DefaultObjectWrapperFactory。默認情況都是使用DefaultObjectWrapperFactory,如果定義了就會使用自定義包裝類!
4. vfs
Vfs是虛擬文件系統用來讀取伺服器相關資源和載入相關的類。提供了2個實現 JBoss6VFS 和 DefaultVFS,並提供了用戶擴展點,可定義VFS實現
載入順序: 自定義VFS實現 > 默認VFS實現 。
"vfs"ref="實現VFS類的vfsimpl"/>
5.typeAliasesPackage
給整個package包起一個別名,那麼這個包下所有的類的別名都是類名首字母小寫。
6.typeAliases
作用:主要用來設置別名,其實這是挺好用的一個功能, 通過配置別名,我們不用再指定完整的包名,並且還能取別名。
7.Plugins
MyBatis 允許你在已映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:
·Executor (update, query, flushStatements, commit, rollback,
getTransaction, close, isClosed)
·ParameterHandler (getParameterObject, setParameters)
·ResultSetHandler (handleResultSets, handleOutputParameters)
·StatementHandler (prepare, parameterize, batch, update, query)
假設你想做的不僅僅是監控方法的調用,那麼你應該很好的了解正在重寫的方法的行為。 因為如果在試圖修改或重寫已有方法的行為的時候,你很可能在破壞 MyBatis 的核心模塊。 這些都是更低層的類和方法,所以使用插件的時候要特別當心。
通過 MyBatis 提供的強大機制,使用插件是非常簡單的,只需實現 Interceptor 介面,並指定了想要攔截的方法簽名即可。
8. typeHandlersPackage、typeHandlers
Mybatis源碼中的處理位置
typeHandlersPackage、typeHandlers是類型轉換器
有這樣一個需求:
有一個布爾型的欄位需要保存到資料庫中,但是資料庫不支持布爾類型,因此採用一位字元(char(1))來存儲這個布爾值,javabean中仍然採用boolean類型。
我們採用mybatis作為持久層框架,但是就有一個問題,資料庫中使char型,而程序中是boolean型,如何實現數據類型自動轉換?解決辦法: mybatis提供了對自定義的類型轉換器(typeHandler)的支持,因此我們可以自己編寫類型轉換器來實現這一自動轉換的功能。 (後期舉例子解釋)
9.databaseIdProvider
作用就是多資料庫環境互相切換,比如同一個系統既要支持oracle又要支持mysql,那麼需要配置這個屬性。
"databaseIdProvider"ref="databaseIdProvider"/>
10. Cache
擴展Mybatis Cache介面,自定義緩存。
11. xmlConfigBuilder
XMLConfigBuilder是對mybatis的配置文件進行解析的類,會對myabtis解析後的信息存放在Configuration對象中,Configuration對象會貫穿整個mybatis的執行流程,為mybatis的執行過程提供各種需要的配置信息。
12. transactionFactory
從源碼可以看出mybatis在沒有定義額外的事務時,會採用spring的事務!
13. mapperLocations
讀取mybatis的xml文件,然後解析xml文件!


TAG:java版web項目 |