前言
創(chuàng)新互聯(lián)公司專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對待客戶,用專業(yè)的服務(wù)創(chuàng)造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。當(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; }