MyBatis 实际使用案例-typeHandlers【重点】
由于Java 類型和數據庫的JDBC 類型不是一一對應的(比如String 與varchar),所以我們把Java 對象轉換為數據庫的值,和把數據庫的值轉換成Java 對象,需要經過一定的轉換,這兩個方向的轉換就要用到TypeHandler。
有的同學可能會有疑問,我沒有做任何的配置,為什么實體類對象里面的一個String屬性,可以保存成數據庫里面的varchar 字段,或者保存成char 字段?
這是因為MyBatis 已經內置了很多TypeHandler(在type 包下),它們全部全部注冊在TypeHandlerRegistry 中,他們都繼承了抽象類BaseTypeHandler,泛型就是要處理的Java 數據類型。
當我們做數據類型轉換的時候,就會自動調用對應的TypeHandler 的方法。
如果我們需要自定義一些類型轉換規則,或者要在處理類型的時候做一些特殊的動作,就可以編寫自己的TypeHandler,跟系統自定義的TypeHandler 一樣,繼承抽象類BaseTypeHandler<T>。有4 個抽象方法必須實現,我們把它分成兩類:?
set 方法從Java 類型轉換成JDBC 類型的,get 方法是從JDBC 類型轉換成Java 類型的。
| 從Java 類型到JDBC 類型 | 從JDBC 類型到Java 類型 |
| setNonNullParameter:設置非空參數 | getNullableResult:獲取空結果集(根據列名),一般都是調用這個 getNullableResult:獲取空結果集 |
比如我們想要在獲取或者設置String 類型的時候做一些特殊處理,我們可以寫一個String 類型的TypeHandler(mybatis-standalone 工程)。
public class MyTypeHandler extends BaseTypeHandler<String> {public void setNonNullParameter(PreparedStatement ps, int i, String parameter,JdbcType jdbcType)throws SQLException {// 設置String 類型的參數的時候調用,Java 類型到JDBC 類型System.out.println("---------------setNonNullParameter1:"+parameter);ps.setString(i, parameter);}public String getNullableResult(ResultSet rs, String columnName) throws SQLException{// 根據列名獲取String 類型的參數的時候調用,JDBC 類型到java 類型System.out.println("---------------getNullableResult1:"+columnName);return rs.getString(columnName);}// 后面兩個方法省略………… }第二步,在mybatis-config.xml 文件中注冊:
<typeHandlers><typeHandler handler="com.gupaoedu.type.MyTypeHandler"></typeHandler> </typeHandlers>第三步,在我們需要使用的字段上指定,比如:
插入值的時候,從Java 類型到JDBC 類型,在字段屬性中指定typehandler:
<insert id="insertBlog" parameterType="com.gupaoedu.domain.Blog">insert into blog (bid, name, author_id)values (#{bid,jdbcType=INTEGER},#{name,jdbcType=VARCHAR,typeHandler=com.gupaoedu.type.MyTypeHandler},#{authorId,jdbcType=INTEGER}) </insert>返回值的時候,從JDBC 類型到Java 類型,在resultMap 的列上指定typehandler:
<result column="name" property="name" jdbcType="VARCHAR" typeHandler="com.leon.type.MyTypeHandler"/>【思考,不強制要求完成】
如果我們的對象里面有復雜對象,比如Blog 里面包括了一個Comment 對象,這個時候Comment 對象的全部屬性不能直接映射到數據庫的一個字段。
要求:創建一個TypeHandler,可以將任意的對象轉換為json 字符串,保存到數據庫的VARCHAR 類型中。在從數據庫查詢的時候,再轉換為原來的Java 對象。
1、在數據庫表添加一個VARCHAR 字段;
2、在Blog 對象中添加一個Comment 屬性,字段Integer id;String content;
3、JSON 工具沒有要求,jackson 或者fastjson、gson 都可以。
4、在查詢和插入的statement 上使用這個TypeHandler。
?
總結
以上是生活随笔為你收集整理的MyBatis 实际使用案例-typeHandlers【重点】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis 实际使用案例-typeA
- 下一篇: MyBatis 实际使用案例-objec