Spring Boot+Mybatis結合PostGreSQL專案,介面開發遇到的問題總結
阿新 • • 發佈:2019-02-20
一、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,插入值成功