前言
當(dāng)大家使用mybatis作為持久層框架時,在存儲和查詢數(shù)據(jù)時,只需要在mapper.xml文件中配置好對應(yīng)字段的JdbcType和JavaType,mybatis就可以幫我們轉(zhuǎn)化對應(yīng)的類型。這背后是有mybatis內(nèi)置的類型轉(zhuǎn)換器做轉(zhuǎn)換(可見源碼TypeHandlerRegistry)。但是有時候,我們會對某些字段做特殊處理,比如加密和解密、狀態(tài)轉(zhuǎn)換、類型轉(zhuǎn)換等。這個時候我們需要自定義類型轉(zhuǎn)換器。
類架構(gòu)
從上面的圖中可以看出MyBatis中整個類型處理器實(shí)現(xiàn)架構(gòu),TypeHandler接口定義了類型處理器,而TypeReference抽象類則定義了一個類型引用,用于引用一個泛型類型(此處很抽象,不好理解,詳見后續(xù)解析),BaseTypeHandler則是類型處理器的基礎(chǔ),是所有類型處理器的公共模塊,幾乎所有的類型處理器都是通過直接繼承BaseTypeHandler來實(shí)現(xiàn)的。
一、原理
使用場景:mybatis在預(yù)處理語句(PreparedStatement)中設(shè)置一個參數(shù)時,或者從結(jié)果集(ResultSet)中取出一個值時,都會用到TypeHandler。它的作用就是將java類型(javaType)轉(zhuǎn)化為jdbc類型(jdbcType),或者將jdbc類型(jdbcType)轉(zhuǎn)化為java類型(javaType)。
二、自定義類型處理器
實(shí)現(xiàn)TypeHandler接口或者繼承BaseTypehandler
TypeHandler是一個接口,它定義了如下四個方法,實(shí)現(xiàn)類必須去實(shí)現(xiàn),方法如下:
void setParameter(PreparedStatement var1, int var2, T var3,JdbcType var4) throws SQLException; T getResult(ResultSet var1, String var2) throws SQLException; T getResult(ResultSet var1, int var2) throws SQLException; T getResult(CallableStatement var1, int var2) throws SQLException; }