1,枚举类
public enum GenderEnum implements CodeDescEnum {
/**
* 0未知,1男,2女
*/
UNKNOWN(0, "未知"),
MALE(1, "男"),
FEMALE(2, "女");
private Integer code;
private String desc;
GenderEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public String getDesc() {
return desc;
}
@Override
public Integer getCode() {
return code;
}
}
2,编写Hanlder 继承CodeIdentifyEnumHandler
public class GenderEnumHandler extends CodeIdentifyEnumHandler<GenderEnum> {
public GenderEnumHandler() {
super(GenderEnum.class);
}
}
3,CodeIdentifyEnumHandler
public abstract class CodeIdentifyEnumHandler<T extends Enum<T> & CodeDescEnum> extends BaseTypeHandler<T> {
private Class<T> type;
/**
* 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
*
* @param type 配置文件中设置的转换类
*/
public CodeIdentifyEnumHandler(Class<T> type) {
if (type == null)
throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnName));
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnIndex));
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return CodeDescEnum.getFromCodeOrThrow(type, cs.getInt(columnIndex));
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getCode());
}
}
4 , 看一下CodeDescEnum
public interface CodeDescEnum {
Map<Class, Map<String, CodeDescEnum>> descEnumCache = new HashMap<>();
Map<Class, Map<Integer, CodeDescEnum>> codeEnumCache = new HashMap<>();
@SuppressWarnings(value = {"unchecked"})
static <Y extends CodeDescEnum> Optional<Y> getFromDescOpt(Class<Y> clazz, String desc) {
Map<String, CodeDescEnum> clazzEnumMap = descEnumCache.get(clazz);
// 初始化enumMap
if (clazzEnumMap == null) {
clazzEnumMap = new HashMap<>();
for (Y type : clazz.getEnumConstants()) {
clazzEnumMap.put(type.getDesc(), type);
}
descEnumCache.put(clazz, clazzEnumMap);
}
return Optional.ofNullable((Y) clazzEnumMap.get(desc));
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromDescOrNull(Class<T> clazz, String desc) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
return (T) codeIdentifyEnumOpt.orElse(null);
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromDescOrThrow(Class<T> clazz, String desc) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
if (codeIdentifyEnumOpt.isPresent()) {
return (T) codeIdentifyEnumOpt.get();
}
throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "类型", "不存在的" + clazz.getSimpleName() + "类型desc=" + desc);
}
@SuppressWarnings(value = {"unchecked"})
static <Y extends CodeDescEnum> Optional<Y> getFromCodeOpt(Class<Y> clazz, Integer code) {
Map<Integer, CodeDescEnum> clazzEnumMap = codeEnumCache.get(clazz);
// 初始化enumMap
if (clazzEnumMap == null) {
clazzEnumMap = new HashMap<>();
for (Y type : clazz.getEnumConstants()) {
clazzEnumMap.put(type.getCode(), type);
}
codeEnumCache.put(clazz, clazzEnumMap);
}
return Optional.ofNullable((Y) clazzEnumMap.get(code));
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromCodeOrNull(Class<T> clazz, Integer code) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
return (T) codeIdentifyEnumOpt.orElse(null);
}
@SuppressWarnings(value = {"unchecked"})
static <T extends CodeDescEnum> T getFromCodeOrThrow(Class<T> clazz, Integer code) {
Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
if (codeIdentifyEnumOpt.isPresent()) {
return (T) codeIdentifyEnumOpt.get();
}
throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "类型", "不存在的" + clazz.getSimpleName() + "类型code=" + code);
}
String getDesc();
Integer getCode();
}
5,po中的配置
public class UserPO implements Serializable {
...
@ColumnType(typeHandler = GenderEnumHandler.class)
private GenderEnum gender;
6,mapper.xml中的配置
<resultMap id="BaseResultMap" type="com.yiwise.core.dal.entity.UserPO">
...
<result column="gender" jdbcType="INTEGER" property="gender"
typeHandler="com.yiwise.core.model.enums.handler.GenderEnumHandler"/>
</resultMap>
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦