需求
数据传递过来的值是枚举的name;存储到数据库为code;查询出来,code化为name,给出去。
看图–查询
1数据
2枚举
3接口
3结果
看图–插入
数据库
代码实现
public class AutoEnumTypeHandler <E extends Enum<E>> extends BaseTypeHandler<E> {
private BaseTypeHandler typeHandler;
public AutoEnumTypeHandler(Class<E> enumType){
if (enumType == null) {
throw new IllegalArgumentException("枚举类型不能为空");
}
//判断两个类是不是父子关系
if(IUserLevelEnum.class.isAssignableFrom(enumType)){
System.out.println("数据库使用用户等级枚举自动转换");
typeHandler = new UserLevelEnumTypeHandler(enumType);
}else {
System.out.println("数据库使用默认类型转换");
typeHandler = new EnumTypeHandler<>(enumType);
}
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, E e, JdbcType jdbcType) throws SQLException {
typeHandler.setNonNullParameter(preparedStatement,i, e,jdbcType);
}
@Override
public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
return (E) typeHandler.getNullableResult(resultSet, s);
}
@Override
public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
return (E) typeHandler.getNullableResult(resultSet, i);
}
@Override
public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return (E) typeHandler.getNullableResult(callableStatement, i);
}
}
public class UserLevelEnumTypeHandler<E extends Enum<?> & IUserLevelEnum> extends BaseTypeHandler<IUserLevelEnum> {
private Class<E> enumType;
public UserLevelEnumTypeHandler(Class<E> enumType){
if (null == enumType){
throw new IllegalArgumentException("用户等级枚举类型不能为空");
}
this.enumType = enumType;
}
/**
* 把Java类型的参数转换为对应的数据库类型
* @param preparedStatement
* @param i
* @param baseEnum
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, IUserLevelEnum baseEnum, JdbcType jdbcType) throws SQLException {
preparedStatement.setInt(i, baseEnum.getCode());
}
/**
* 通过字段名称获取字段数据时,把数据库类型转换为对应的Java类型
* @param resultSet
* @param s
* @return
* @throws SQLException
*/
@Override
public IUserLevelEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
int enumCode = resultSet.getInt(s);
return resultSet.wasNull() ? null : valueConvert(enumCode);
}
/**
* 通过字段索引获取字段数据时,把数据库类型转换为对应的Java类型
* @param resultSet
* @param i
* @return
* @throws SQLException
*/
@Override
public IUserLevelEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
int enumCode = resultSet.getInt(i);
return resultSet.wasNull() ? null : valueConvert(enumCode);
}
/**
* 调用存储过程时,把数据库类型转换为对应的Java类型
* @param callableStatement
* @param i
* @return
* @throws SQLException
*/
@Override
public IUserLevelEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
int enumCode = callableStatement.getInt(i);
return callableStatement.wasNull() ? null : valueConvert(enumCode);
}
private E valueConvert(int enumValue){
try {
return EnumUtil.convertEnumValue(enumType, enumValue);
} catch (Exception ex) {
throw new IllegalArgumentException("无法将枚举值" + enumValue + " 转换成 " + enumType.getSimpleName() + ",异常信息:", ex);
}
}
}
public class EnumUtil {
/**
* 枚举值转换
* @param enumClass
* @param enumCode
* @param <E>
* @return
*/
public static <E extends Enum<?> & IUserLevelEnum> E convertEnumValue(Class<E> enumClass, int enumCode) {
E[] enumConstants = enumClass.getEnumConstants();
for (E e : enumConstants) {
if (e.getCode() == enumCode)
return e;
}
return null;
}
}
demo已经写好,下载运行即可