主要是针对查询时,返回的实体中的存在枚举类的处理
1.
2.返回实体中添加注解 3.具体的handler实现
@MappedTypes({BaseEnum.class})
public class ValueEnumTypeHandler<E extends Enum<?>> extends BaseTypeHandler<E> {
private Class<E> type;
public ValueEnumTypeHandler(Class<E> type) {
this.type = type;
}
/**
* 通过属性名获取属性值 忽略大小写
*
* @param o
* @param name
* @return
* @throws Exception
*/
public static Object getFieldValue(Object o, String name) throws Exception {
Field[] fields = o.getClass().getDeclaredFields();
Object object = null;
for (Field field : fields) {
field.setAccessible(true);//可以获取到私有属性
if (field.getName().toUpperCase().equals(name.toUpperCase())) {
object = field.get(o);
break;
}
}
return object;
}
private E getE(int i) {
E[] enumConstants = type.getEnumConstants();
for (E enumConstant : enumConstants) {
try {
if (String.valueOf(i).equals(String.valueOf(getFieldValue(enumConstant, "value")))) {
return enumConstant;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 用于在Mybatis获取数据结果集时如何把数据库类型转换为对应的Java类型
*
* @param rs 当前的结果集
* @param columnName 当前的字段名称
* @return 转换后的Java对象
* @throws SQLException
*/
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 根据数据库存储类型决定获取类型
int i = rs.getInt(columnName);
if (rs.wasNull()) {
return null;
} else {
return getE(i);
}
}
/**
* 用于在Mybatis通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
*
* @param rs 当前的结果集
* @param columnIndex 当前字段的位置
* @return 转换后的Java对象
* @throws SQLException
*/
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int i = rs.getInt(columnIndex);
if (rs.wasNull()) {
return null;
} else {
return getE(i);
}
}
/**
* 用于Mybatis在调用存储过程后把数据库类型的数据转换为对应的Java类型
*
* @param cs 当前的CallableStatement执行后的CallableStatement
* @param columnIndex 当前输出参数的位置
* @return
* @throws SQLException
*/
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int i = cs.getInt(columnIndex);
if (cs.wasNull()) {
return null;
} else {
return getE(i);
}
}
/**
* 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型
*
* @param ps 当前的PreparedStatement对象
* @param i 当前参数的位置
* @param parameter 当前参数的Java对象
* @param jdbcType 当前参数的数据库类型
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
// baseTypeHandler已经帮我们做了parameter的null判断
try {
ps.setInt(i, (int) getFieldValue(parameter, "value"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.如果想针对返回的枚举格式化,则需要在枚举类添加注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)