第一:
我们使用mybatis的时候 java类会定义成枚举类与数据库表进行映射,而mybaits 默认插入取的枚举的名称,
列如 : RETURN(10,“退货”),存入数据库则是return ;而我们需要的是存入 code 10。未解决本问题则需要自己定义类来重写实现,需要继承BaseTypeHandler :
package com.biz.primus.model.scan.code.enums;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
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;
/**
* @ClassName BaseEnumTypeHandler
* @Description 枚举类型处理类
* @Author Jaye
* @Date 2019/3/27
**/
public class BaseEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
private Class<E> type;
public BaseEnumTypeHandler() {
}
public BaseEnumTypeHandler(Class<E> type) {
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
if (jdbcType == null) {
ps.setString(i, parameter.toString());
} else {
ps.setObject(i, parameter.name(), 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));
}
private <E extends Enum<E>> E get(String v) {
if (v == null) {return null;}
if (StringUtils.isNumeric(v)) {
return get((Class<E>) type, Integer.parseInt(v));
} else {
return Enum.valueOf((Class<E>) type, v);
}
}
private <E extends Enum<E>> E get(Class<E> type, int v) {
Method method = null;
E result = null;
try {
method = type.getMethod("get", int.class);
result = (E) method.invoke(type, v);
} catch (NoSuchMethodException e) {
result = Enum.valueOf(type, String.valueOf(v));
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return result;
}
}
在上面 BaseEnumTypeHandler 中的 setNonNullParameter 实现里 我们将 原来的 修改为 parameter.toString() 然后在枚举类重写toString方法 返回你需要存入的字段 如:RETURN(10,“退货”), 你则需要返回 code 10,
@Override
public String toString() {
return RETURN.code.toString();
}
然后在你插入的 mybatis xml中的 对应字段上加入
typeHandler handler="你自定义类的路劲"
这样插入数据库后的值就是 10 而不是RETURN 。 插入问题完工
第二 :
查询数据返回实体类时需要把刚才存入的10转化为枚举类型 ,就需要再上面自定义类的 get方法中做处理,即把你获取到的10 转成对应的枚举类。
然后 再返回的 resultMap 中类型指定为 typeHandler handler="你自定义类的路劲" 完工