https://blog.wuwii.com/springboot-12.html
前言
在 Spring Boot 中使用 Mybatis 中遇到了字段為枚舉類型,數據庫存儲的是枚舉的值,發現它不能自動裝載。
解決
內置枚舉轉換器
MyBatis內置了兩個枚舉轉換器分別是:org.apache.ibatis.type.EnumTypeHandler
和 org.apache.ibatis.type.EnumOrdinalTypeHandler
。
EnumTypeHandler
mybatis 中默認的枚舉轉換器,是獲取枚舉中的 name
屬性。
EnumOrdinalTypeHandler
獲取枚舉中 ordinal
屬性,就是例如索引一樣的東西,不過是從 1 開始遞增的。
因此上面提供的兩種的轉換器都不能滿足我們的需求,我們需要自定義一個轉換器。
自定義枚舉轉換器
MyBatis提供了 org.apache.ibatis.type.BaseTypeHandler
類用於我們自己擴展類型轉換器,上面的EnumTypeHandler和EnumOrdinalTypeHandler
也都實現了這個接口。
繼承 BaseTypeHandler<T>
一共需要實現4個方法:
void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
用於定義設置參數時,該如何把Java類型的參數轉換為對應的數據庫類型;T getNullableResult(ResultSet rs, String columnName)
用於定義通過字段名稱獲取字段數據時,如何把數據庫類型轉換為對應的Java類型;T getNullableResult(ResultSet rs, int columnIndex)
用於定義通過字段索引獲取字段數據時,如何把數據庫類型轉換為對應的Java類型;T getNullableResult(CallableStatement cs, int columnIndex)
用定義調用存儲過程后,如何把數據庫類型轉換為對應的Java類型。
定義一個枚舉通用行為
定義一個枚舉通用行為,規范枚舉的實現。
1 |
public interface BaseEnum<E extends Enum<?>, T> { |
定義自己需要的枚舉:
1 |
public class SysConstant { |
實現自定義轉換器
自定義一個基本的枚舉轉換器工具,如果有其他需求可以在這個基類上自定義。
1 |
package com.wuwii.common.util; |