java使用mybatis的typehandler处理char类型的enum 传值进数据库的时候出现这个情况:
数据库拿出来的时候enum 转型是没有问题的,传入数据库的时候出现这个问题
附一下代码:
public enum Flag {
ACTIVE('a'),
INACTIVE('i'),
DUPLICATED('d'),
PURGE('p')
;
private char value;
public static Flag findByValue(char value) {
for (Flag flag : values()) {
if (flag.getValue() == value) {
return flag;
}
}
return null;
}
Flag(char value) {
this.value = value;
}
public final char getValue() {
return this.value;
}
}
public class FlagTypeHandler extends BaseTypeHandler> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Enum flag, JdbcType jdbcType) throws SQLException {
ps.setString(i,flag.name());
}
@Override
public Enum getNullableResult(ResultSet rs, String columnName) throws SQLException {
char value = rs.getString(columnName).charAt(0);
return Flag.findByValue(value);
}
@Override
public Enum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
char value = rs.getString(columnIndex).charAt(0);
return Flag.findByValue(value);
}
@Override
public Enum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
char value = cs.getString(columnIndex).charAt(0);
return Flag.findByValue(value);
}
}
1.把数据库的char(1) 改成 char(255),传入"ACTIVE",成功,但是数据库保存的是"ACTIVE",显然typeHandler解析错误
2.仔细看一下代码,是在 "ps.setString(i,flag.name());" 这里出错,修改成:
ps.setString(i,String.valueOf(flag.name().charAt(0)));
试了一下,传入ACTIVE ,没有报错,数据库变成A
不对劲,看了一下,上面这个是取了name第一个字母,应该取得是value
3. 再修改
ps.setString(i,Character.toString(Flag.valueOf(flag.name()).getValue()));
再次测试,传入"ACTIVE" 数据库存放"a",成功
4.贴一下最终改好的代码
public class FlagTypeHandler extends BaseTypeHandler> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Enum flag, JdbcType jdbcType) throws SQLException {
ps.setString(i, Character.toString(Flag.valueOf(flag.name()).getValue()));
}
@Override
public Enum getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Optional.ofNullable(rs.getString(columnName)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
}
@Override
public Enum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Optional.ofNullable(rs.getString(columnIndex)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
}
@Override
public Enum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Optional.ofNullable(cs.getString(columnIndex)).flatMap(s -> Optional.ofNullable(Flag.findByValue(s.charAt(0)))).orElse(null);
}
}
5.总结
对typeHandler 不熟悉导致 解析的时候写错了,要取的 value 写成name。特别感谢老大帮忙,耶