PSQLException:ERROR: value too long for type character(1)

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。特别感谢老大帮忙,耶

你可能感兴趣的:(Java,plsql,mybatis)