由於對MyBatis在JDBC數據和Java對象之間數據轉化比較感興趣,因此就記錄並學習一下TypeHandler.java
如上圖所示,觀察下接口方法就能明白.TypeHandler主要用於JDBC數據與Java對象數據之間轉化,好比更新數據庫的時候能夠設置java對象裏的字段怎麼映射到JDBC數據庫支持的類型.或者查詢數據的時候,返回的JDBC的數據怎麼轉化成Java對象中的屬性.mysql
這篇文章主要以一個select查詢爲例,學習下TypeHandler都被應用在了哪些階段? 怎麼被使用的.sql
正如以前文章分享的那樣.MyBatis在初始化build SqlSessionFactory的時候會解析一大堆東西,生成Configuration.內置的TypeHandler在這個階段被初始化.數據庫
如上圖, new Configuration的時候會初始化TypeHandlerRegistry.mybatis
而這個Registry的構造方法就是註冊各類內置的TypeHandler的地方.app
如上圖所示, register方法用於向TypeHandlerRegistry的成員域(Map)裏註冊TypeHandler.學習
register方法被重載了N屢次.可是能夠概括爲大體幾種做用.ui
在此以前先介紹下TypeHandlerRegistry的幾個成員域.由於register方法與他們密不可分.spa
固然也有相似public <T> void register(TypeHandler<T> typeHandler)這種變體.會掃描Handler上面的MappedTypes註解,找到對應的javaType.3d
在初始化的解析conf的時候會解析
這個代碼比較簡單,直接看就能明白.惟一要注意的是是先初始化自帶的typeHandler.再加載自定義的typeHandler.因此本身定義的可能會覆蓋mybatis內置的.
其實這個也算是初始化階段...在解析完自定義的typeHandler以後須要解析Mapper
解析Mapper中有1個很重要的步驟就是解析resultMap.
resultMap裏須要指定JavaType與JdbcType之間的映射.
那麼若是不指定的時候呢?
由於知道jdbcType和Java類型(property),因此會調用這個方法找到對應的TypeHandler
從上圖咱們也能夠發現,知道了JavaType會取到jdbcType爲key, Handler爲Value的Map.而後從Map中根據jdbcType去找對應的handler.若是沒有,那就使用null做爲key去找.至關於null爲key獲得的是一種不指定JdbcType的通用handler.
若是尚未就作pickSoleHandler方法,取對應的handler(若是這個JavaType只有惟一一個handler,那就取這個,否則就返回null).如此就肯定了handler是哪一個了.
當作selectByPrimaryKey的時候就會調用對應的方法作JAVA->JDBC的類型轉化(java Int -> mysql integer)
一樣道理,獲得結果集映射到Java對象的時候也會掉相應的方法