MyBatis自带两种(EnumOrdinalTypeHandler和EnumTypeHandler)枚举转换器,但只支持最基本的枚举类型
与ordinal属性相互转换
EnumOrdinalTypeHandler可将枚举的ordinal属性和int相互转换
1
| enum GenderEnum{MALE,FEMALE}
|
会将GenderEnum.MALE转为0,GenderEnum.FEMALE转为1(可相互转换)
与名称相互转换
EnumTypeHandler可将枚举的名称和string相互转换
1
| enum GenderEnum{MALE,FEMALE}
|
会将GenderEnum.MALE转为"MALE",GenderEnum.FEMALE转为"FEMALE"(可互相转换)
自定义转换
对于复杂的Enum则需要自定义转换器
复杂枚举1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| enum GenderEnum{ MALE(1,"male"), FEMAIL(2,"female");
private Map<int, GenderEnum> map = new HashMap<>();
static{ for(GenderEnum g:GenderEnum.values()){ map.put(g.getKey,g); }
private int key; private String value;
GenderEnum(int key, String value){ this.key=key; this.value=value; }
public GenderEnum getGenderByKey(int key){ return map.get(key); } public int getKey(){ return key; } }
|
自定义枚举转换器1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class GenderEnumTypeHandler extends BaseTypeHandler<GenderEnum> {
@Override public void setNonNullParameter(PreparedStatement ps, int i, GenderEnum parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter.getKey()); }
@Override public GenderEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { int key = rs.getInt(columnName); if (rs.wasNull()) { return null; } return GenderEnum.getGenderByKey(key); }
@Override public GenderEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int key = rs.getInt(columnIndex); if (key == 0 && rs.wasNull()) { return null; } return Method.getGenderByKey(key); }
@Override public GenderEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int key = cs.getInt(columnIndex); if (key == 0 && cs.wasNull()) { return null; } return Method.getGenderByKey(key); } }
|