Spring Boot+Mybatis结合PostGreSQL项目,接口开发遇到的问题总结

一、paramType为自定义object,object含数组属性,从数据库取数组数据时遇到报错:数据类型不匹配

详细情况如下:

ps:pgsql数据库中数组字段为double precision[]类型

问题解决:

1.设置表对象该属性为Double[]类型

2.mybatis中获取数据库表数据时,运用pgsql遍历数组的unnest()函数,例如:

3.ok,取值正常

二、向pgsql数据库中类型为double precision[]的表字段插入值报错:类型不匹配,不良数据类型

解决方法:

1.同上设置相关字段类型为:Double[]

2.添加ArrayTypeHandler类,用于处理数组类型

// 继承自BaseTypeHandler<Object[]> 使用时传入的参数一定要是Object[],例如 int[]是 Object,不是Object[],所以传入int[] 会报错的
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {

    private static final String TYPE_NAME_VARCHAR = "varchar";
    private static final String TYPE_NAME_INTEGER = "integer";
    private static final String TYPE_NAME_BOOLEAN = "boolean";
    private static final String TYPE_NAME_NUMERIC = "numeric";

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter,
                                    JdbcType jdbcType) throws SQLException {

        String typeName = null;
        if (parameter instanceof Integer[]) {
            typeName = TYPE_NAME_INTEGER;
        } else if (parameter instanceof String[]) {
            typeName = TYPE_NAME_VARCHAR;
        } else if (parameter instanceof Boolean[]) {
            typeName = TYPE_NAME_BOOLEAN;
        } else if (parameter instanceof Double[]) {
            typeName = TYPE_NAME_NUMERIC;
        }

        if (typeName == null) {
            throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
        }

        // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName, parameter);
        ps.setArray(i, array);
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, String columnName)
            throws SQLException {

        return getArray(rs.getArray(columnName));
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

        return getArray(rs.getArray(columnIndex));
    }

    @Override
    public Object[] getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {

        return getArray(cs.getArray(columnIndex));
    }

    private Object[] getArray(Array array) {

        if (array == null) {
            return null;
        }

        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }

        return null;
    }
}

参考自:(mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler)https://www.cnblogs.com/kylindai/p/3563818.html

3.添加ArrayTypeHandler处理数组类到insert语句的字段赋值中,例如:

4.ok,插入值成功

转载自:https://blog.csdn.net/m0_37707170/article/details/81705719

You may also like...