【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自動識別。