mybatis统一枚举自定义处理器
- 使用场景:
mybatis自带的枚举处理器是name和ordinal两种处理器
当需要下列枚举的value为数据库的值时,则不满足:
public enum BlogStatusEnum {
DRAFT(1, "草稿"),
RELEASED(2, "已发布"),
DELETED(3, "已删除");
private final Integer value;
private final String remark;
BlogStatusEnum(Integer value, String remark) {
this.value = value;
this.remark = remark;
}
public Integer getValue() {
return value;
}
public String getRemark() {
return remark;
}
}
自定义枚举处理器开始
- 1 枚举类的处理
public enum BlogStatusEnum {
DRAFT(1, "草稿"),
RELEASED(2, "已发布"),
DELETED(3, "已删除");
private final Integer value;
private final String remark;
BlogStatusEnum(Integer value, String remark) {
this.value = value;
this.remark = remark;
}
public Integer getValue() {
return value;
}
public String getRemark() {
return remark;
}
/**
* 根据指定的值获取枚举对象
*/
public static BlogStatusEnum get(Integer value) {
for (BlogStatusEnum blogStatusEnum : BlogStatusEnum.values()) {
if (blogStatusEnum.getValue() == value) {
return blogStatusEnum;
}
}
return null;
}
/**
* 获取当前枚举的value值
*/
@Override
public String toString() {
return String.valueOf(this.value);
}
}
- 2 创建自定义处理器,复制修改于源码 org.apache.ibatis.type.EnumTypeHandler
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.StringUtils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 自定义枚举转换器类型
*/
public class MyEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
private final Class<E> type;
public MyEnumTypeHandler(Class<E> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
} else {
this.type = type;
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
//使用toString方法来进行值的设置,需重写枚举的toString方法
if (jdbcType == null) {
ps.setString(i, parameter.toString());
} else {
ps.setObject(i, parameter.toString(), jdbcType.TYPE_CODE);
}
}
@Override
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
return get(rs.getString(columnName));
}
@Override
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return get(rs.getString(columnIndex));
}
@Override
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return get(cs.getString(columnIndex));
}
/**
* 根据value获取枚举对象
*
* @param v
* @param <E>
* @return
*/
private <E extends Enum<E>> E get(String v) {
if (v == null) return null;
if (!StringUtils.isEmpty(v)) {
Method method = null;
try {
method = type.getMethod("get", Integer.class);
return (E) method.invoke(type, Integer.parseInt(v));
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
} else {
return null;
}
}
}
- 3 指定枚举处理器 application.properties
# 自定义枚举处理类
mybatis.configuration.default-enum-type-handler=com.xxx.xxx.MyEnumTypeHandler
自定义枚举处理器结束
就可以在实体类中使用枚举,进行正常的使用,数据库存储的是枚举的value值,读取出来的是枚举对象