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