TypeHandler轉換指定數據庫中數據為Enum枚舉
在一些時候,我們的數據庫需要存放一些例如狀態信息的數據,通常的我們使用int整型來保存,例如(0:失敗,1:成功)等,用這樣的數據是可以的,但對於前端的編程是不友好的,所以我們可以使用TypeHandler來進行一個轉換,將其轉化成一個枚舉型。
一、數據庫中的數據定義
這里的user_state和user_priority表示了一些狀態信息(范圍是整數0~5),接下來我們要將這個轉化為枚舉型
二、創建枚舉Enum類
以User_state為例:
package com.snapshot2.demo.enumeration; public enum UserStateEnum { NORMAL(0,"正常狀態"), FROZEN(1,"凍結"), BAN(2,"禁用"), MUTE(3,"禁言"), SENSITIVE(4,"敏感用戶"), DYF(5,"這是創作者董一帆的"); private int stateCode; private String stateString; public static UserStateEnum getUserStateByCode(int stateCode){ for (UserStateEnum stateEnum: values()){ if(stateEnum.getStateCode() == stateCode){ return stateEnum; } } return null; } /* Constructor */ UserStateEnum(int stateCode, String stateString) { this.stateCode = stateCode; this.stateString = stateString; } /* Getter and Setter */ public int getStateCode() { return stateCode; } public void setStateCode(int stateCode) { this.stateCode = stateCode; } public String getStateString() { return stateString; } public void setStateString(String stateString) { this.stateString = stateString; } }
三、創建相應得TypeHandler類,繼承於BaseTypeHandler<T>類,並重寫相應得方法
1.這里的<T>是我們指定轉化的類型
2.@MappedJdbcTypes注解聲明數據庫中對應數據類型
3.@MappedTypes(value = UserStateEnum.class)聲明轉化后的類型
package com.snapshot2.demo.typehandler; import com.snapshot2.demo.enumeration.UserStateEnum; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /* 數據庫中的數據類型 */ @MappedJdbcTypes(JdbcType.INTEGER) /* 轉化后的數據類型 */ @MappedTypes(value = UserStateEnum.class) public class UserStateTypeHandler extends BaseTypeHandler<UserStateEnum> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, UserStateEnum userStateEnum, JdbcType jdbcType) throws SQLException { preparedStatement.setInt(i,userStateEnum.getStateCode()); } @Override public UserStateEnum getNullableResult(ResultSet resultSet, String s) throws SQLException { int code =resultSet.getInt(s); if(code>=0&&code<=5){ return UserStateEnum.getUserStateByCode(code); } return null; } @Override public UserStateEnum getNullableResult(ResultSet resultSet, int i) throws SQLException { int code = resultSet.getInt(i); if(code>=0&&code<=5){ return UserStateEnum.getUserStateByCode(code); } return null; } @Override public UserStateEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException { int code = callableStatement.getInt(i); if(code>=0&&code<=5){ return UserStateEnum.getUserStateByCode(code); } return null; } }
四、最后在application.properties配置文件中springboot指定TypeHandler所在的包
mybatis.type-handlers-package=com.snapshot2.demo.typehandler