MyBatis 學習記錄6 TypeHandler

主題

  由於對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

JDBC_TYPE_HANDLER_MAP key爲JDBC類型 Value是TypeHandler
TYPE_HANDLER_MAP    key是Java的Class類型,好比String.class, Value是1個Map,Key是JDBC類型,Value是TypeHandler. Value的key能夠爲null
ALL_TYPE_HANDLERS_MAP key是TypeHandler的Class類型, Value是TypeHandler

 

register有不少重載的方法.小結一下的話大約有2個分支:
register(Type javaType, JdbcType jdbcType, TypeHandler<?> handler)
這個方法就是
1. 爲1個Java類型添加對應的JDBC類型與handler. 主要是往TYPE_HANDLER_MAP裏添加數據
2. 記錄有哪些TypeHandler.即往ALL_TYPE_HANDLERS_MAP中 裏面添加數據.
它的一個變體是register(Type javaType, TypeHandler<? extends T> typeHandler)這個方法. 沒有傳JdbcType. 在這種狀況下會掃描Handler上面的MappedJdbcTypes註解,找到這個handler對應的JdbcType.

固然也有相似public <T> void register(TypeHandler<T> typeHandler)這種變體.會掃描Handler上面的MappedTypes註解,找到對應的javaType.3d

 

register(JdbcType jdbcType, TypeHandler<?> handler) 這個分支是不傳Java Type變量的.
這個分支就比較簡單了.往JDBC_TYPE_HANDLER_MAP中加入數據
 
 
除了內置的TypeHandler本身也能夠設置自定義的TypeHandler

在初始化的解析conf的時候會解析

這個代碼比較簡單,直接看就能明白.惟一要注意的是是先初始化自帶的typeHandler.再加載自定義的typeHandler.因此本身定義的可能會覆蓋mybatis內置的.

 
至此,TypeHandlerRegistry就已經完成了註冊handler的任務了.
 
 

解析Mapper階段

其實這個也算是初始化階段...在解析完自定義的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對象的時候也會掉相應的方法

相關文章
相關標籤/搜索