MyBatis 操作 PostgreSQL array数组类型
记:MyBatis 如何操作 PostgreSQL array数组类型
定义处理器
/**
* @desc mybatis 操作 postgreSQL array 数组类型
* @auth llp
* @date 2022/7/1 15:57
*/
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 preparedStatement, 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, you type is " + parameter.getClass().getName());
}
// 关键代码
Connection conn = preparedStatement.getConnection();
Array array = conn.createArrayOf(typeName, parameter);
preparedStatement.setArray(i, array);
}
@Override
public Object[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
return getArray(resultSet.getArray(s));
}
@Override
public Object[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
return getArray(resultSet.getArray(i));
}
@Override
public Object[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return getArray(callableStatement.getArray(i));
}
private Object[] getArray(Array array){
if (array == null) {
return null;
}
try {
return (Object[]) array.getArray();
} catch (SQLException e) {
throw new TypeException("ArrayTypeHandler `(Object[])array.getArray()` is error");
}
}
}
使用方式
Java 实体类中
// 新版没有看到这个注解 mybatis-plus 3.5.2 mybatis 3.5.10
// @ColumnType(typeHandler=com.mvc.handler.ArrayTypeHandler.class)
// private String[] tags;
@TableField(typeHandler = ArrayTypeHandler.class)
private String[] tag;
mapper.xml 中
<resultMap id="xxx">
<result column="tag" property="tag" jdbcType="ARRAY" typeHandler="com.xxx.handler.ArrayTypeHandler" />
</resultMap>
<select resultMap="xxx">
select xxx
</select>
SQL 语句中
insert into
xxx
values (
#{tag, jdbcType=ARRAY, typeHandler="com.xxx.handler.ArrayTypeHandler"}
)
注意:
如果想要把 postgreSQL 数据库表中的 数组字段的值映射到 Java 的 Pojo 对象中,必须使用 resultMap 标签来映射,否则此字段为 null。