1. 程式人生 > >【MyBatis學習17】用typeHandlers處理enum型別

【MyBatis學習17】用typeHandlers處理enum型別

如果想使用mybatis自帶的列舉類處理,有2種方式,一個是EnumTypeHandler,一個是EnumOrdinalTypeHandler。
區別如下:

EnumTypeHandler直接儲存name值。它是mybatis預設的列舉型別轉換器。
EnumOrdinalTypeHandler儲存enum類裡的序號值,此時資料庫表字段一般對應用smallint/int型別的處理。

使用的時侯很簡單,在insert或者update語句塊,或者resultMap欄位等地方指定相應的typeHandler即可。

<insert id="insertUser" parameterType="User">
    insert into user(id,userName,status)
    values(#{id}
, #{userName},#{status, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}) </insert>

<resultMap id="BaseResultMap" type="User">
    <id column="id" property="userId" jdbcType="INTEGER" />
    <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
/> </resultMap>

不過大多數情況下,想儲存的並不是列舉的順序號,而是儲存自定義的id值,這時我們就需要自己寫enum的處理類。

若程式中原來有一個列舉類,name是長沙、株洲、湘潭三地,value採用身份證上的地區編號。

public enum CityTest {
    ChangSha(4301),Zhuzhou(4302),Xiangtan(4303);

    int value;
    private CityTest(int value){
        this.value=value;
    }
    public int getValue
() { return this.value; } /*方法Value2CityTest是為了typeHandler後加的*/ public static CityTest Value2CityTest(int value) { for (CityTest citytest : CityTest.values()) { if (citytest.value == value) { return citytest; } } throw new IllegalArgumentException("無效的value值: " + value + "!"); } }

根據上一章《【MyBatis學習16】自定義型別處理器typeHandlers介紹 》我們知道,在實現typeHandler時,需要用到兩個方法
一個方法將javaType轉成jdbcType,另一個方法將jdbcType轉成javaType。

將javaType轉成jdbcType我們可以用CityTest中的getValue(),獲取當前CityTest物件的value值即可。
那麼現在要增加一個方法,將jdbcType轉成javaType(這樣就定義了方法的入參和返回型別)。因此我們增加了Value2CityTest方法。

再定義轉換器typeHandler的實現類:

public class CityTestTypeHandler extends BaseTypeHandler<CityTest> {
    @Override
    public CityTest getNullableResult(ResultSet rSet, String columnName)
            throws SQLException {
        return CityTest.Value2CityTest(rSet.getInt(columnName));
    }

    @Override
    public CityTest getNullableResult(ResultSet rSet, int columnIndex)
            throws SQLException {
        return CityTest.Value2CityTest(rSet.getInt(columnIndex));
    }

    @Override
    public CityTest getNullableResult(CallableStatement cStatement, int columnIndex)
            throws SQLException {
        return CityTest.Value2CityTest(cStatement.getInt(columnIndex));
    }

    @Override
    public void setNonNullParameter(PreparedStatement pStatement, int index,
            CityTest citytest, JdbcType jdbcType) throws SQLException {
        pStatement.setInt(index, citytest.getValue());
    }
}

接下來在myBatis配置檔案中註冊

<!-- 註冊自定義型別處理器 -->
<typeHandlers>
    <typeHandler handler="twm.mybatisdemo.type.CityTestTypeHandler" />
</typeHandlers>

然後就可以使用了。

補充:

實際使用中並不一定要求顯示宣告
typeHandler=org.apache.ibatis.type.CityTestTypeHandler,系統會根據型別以及註冊的typeHandler自動識別。