场景:映射字段是枚举类,而枚举的属性是自定义属性,这就不能用
EnumOrdinalTypeHandler和EnumTypeHandler作为处理器了,需要自定义处理器。
上代码:
1.新增基础接口类:
public interface BaseEnum {
int getCode();
}
2.枚举类继承该类,属性约定为code
public enum Sex implements BaseEnum {
MALE(0), FEMALE(1);
private int code;
Sex(int code){
this.code = code;
}
public int getCode() {
return code;
}
}
3.自定义类型处理器,继承BaseTypeHandler,注意,注解为@MappedJdbcTypes,指定java需要转换的jdbc类型
@MappedJdbcTypes(JdbcType.INTEGER)
public class CodeEnumTypeHandler<E extends Enum<?> & BaseEnum> extends BaseTypeHandler<BaseEnum> {
private Class<E> type;
public CodeEnumTypeHandler(){}
public CodeEnumTypeHandler(Class<E> type) {
if(type == null){
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, BaseEnum baseEnum, JdbcType jdbcType) throws SQLException {
preparedStatement.setInt(i, baseEnum.getCode());
}
@Override
public BaseEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
int code = resultSet.getInt(s);
return resultSet.wasNull() ? null: codeOf(code);
}
@Override
public BaseEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
int code = resultSet.getInt(i);
return resultSet.wasNull() ? null: codeOf(code);
}
@Override
public BaseEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
int code = callableStatement.getInt(i);
return callableStatement.wasNull() ? null: codeOf(code);
}
private E codeOf(int code){
try{
return CodeEnumUtil.codeOf(type, code);
}catch (Exception e){
throw new IllegalArgumentException("Cannot convert "+ code + " to "+ type.getSimpleName() + " by code value.", e);
}
}
}
4.实体类的枚举字段(ps:试过这里不写也可以)
/**
* 性别(0:女性,1:男性)
*/
@TableField(value = "SEX",typeHandler = CodeEnumTypeHandler.class)
private Sex sex;
5.application.yml注册处理器
mybatis-plus:
type-handlers-package: com.creativediary.user.handler