MyBatis 配置 typeHandlers 詳解

MyBatis 配置 typeHandlers 詳解

0x00:前言參考

之前的《 》記了一下 MyBatis 中的核心配置文件各個標籤的作用和使用場景,這篇文章細說一下配置文件中 typeHandlers 標籤的詳細使用。

0x01:標籤介紹

在 MyBatis 的 sql 映射配置文件中,為 sql 配置的輸入參數最終要從 java 類型轉換成數據庫能識別的類型,而從 sql 的查詢結果集中獲取的數據,也要從數據庫的數據類型轉換為對應的 Java 類型。

在 MyBatis 中,使用類型處理器(TypeHandler)將數據庫獲取的值以合適的方式轉換為 Java 類型,或者將 Java 類型的參數轉換為數據庫對應的類型。

0x02:編寫說明

使用 typeHandlers 標籤配置一個自己的類型處理器,一般需要三個步驟:編寫類型處理器類,在 MyBatis 全局配置文件中配置該類型處理器,在 sql 映射配置文件中使用。

例如要編寫一個將 JDBC 的 timestamp 類型與 Date 類型相互轉換的類型處理器配置示例。首先編寫類型處理器,一般要實現 org.apache.ibatis.type.TypeHandler 接口,接口的泛型指定要轉換的 Java 參數類型,若不指定則默認為 Object 類,實現 TypeHandler 接口主要改寫四個方法,如下:

MyBatis 配置 typeHandlers 詳解

setParameter 方法是在 sql 配置傳入參數時(新增、刪除、修改、查詢)執行的操作,可以在將參數傳入數據庫之前在該方法中對數據類型做處理。

另外三個 getResult 方法則在數據庫返回結果時,將結果信息轉換為相應的 Java 類型。區別在於前兩個 getResult 方法供普通 select 方法使用,一個根據字段名,一個根據字段下標來獲取數據,最後一個 getResult 方法供存儲過程使用,根據字段下標獲取數據。

0x03:代碼示例

以下代碼是編寫一個將 JDBC 的 timestamp 類型與 Date 類型相互轉換的類型處理器配置示例:

MyBatis 配置 typeHandlers 詳解

之後在 MyBatis 的全局配置文件 SqlMapConfig 中使用 typeHandlers 標籤來註冊類型處理器,示例代碼如下:

MyBatis 配置 typeHandlers 詳解

然後在 sql 映射文件 xxxMapper.xml 中的 sql 語句中添加自定義的類型處理器的處理配置即可,代碼示例如下:

MyBatis 配置 typeHandlers 詳解

如果設置了參數 regdate,就會將 Java 的 Date 類型轉換為數據庫需要的 timestamp 類型。另外,對於查詢結果,如果定義了 resultMap 來設置結果集對象的映射,同樣可以在標籤內指定 javaType,jdbcType 和 typeHandler 的名稱。

0x04:知識拓展

在編寫自定義的類型處理器時,可以不實現 TypeHandler 接口,轉而繼承另一個類 org.apache.ibatis.type.BaseTypeHandler, 它是 MyBatis 的一個標準基礎類型處理器類。

BaseTypeHandler 本身已經實現了 TypeHandler 接口,並繼承了 TypeReferance 抽象類,在它內部簡單的實現了 TypeHandler 接口中定義的四個方法的部分功能。

繼承 BaseTypeHandler 類之後,可以通過改寫 setNonNullParameter、getNullableResult 方法(三個)來實現類型處理器。示例代碼如下:

MyBatis 配置 typeHandlers 詳解

因為 BaseTypeHandler 繼承 TypeReferance 抽象類,所以它本身也是一個抽象類,類中的 4 個方法也為抽象方法。

0x05:總結

MyBatis 中,其內部的類型處理器大部分都是繼承上面的 4 個方法來實現的,當其內部的類型處理器無法滿足開發需求時,就需要自己定義類型處理類,步驟為先編寫類型處理器類,其次將該處理器類配置到全局配置文件中,最後在 sql 映射配置文件中使用即可。


分享到:


相關文章: