1. 程式人生 > >Spring Boot+Mybatis結合PostGreSQL專案,介面開發遇到的問題總結

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;
    }
}

3.新增ArrayTypeHandler處理陣列類到insert語句的欄位賦值中,例如:

4.ok,插入值成功