1、首先,自定义typeHandler
/**
* Created by bo on 2019/1/6.
* java mybatis映射postgresql 数组类型
*/
@MappedJdbcTypes(JdbcType.ARRAY)
@MappedTypes(String[].class)
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 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 (Exception e) {
}
return null;
}
}
2、使用mybatis generator生成实体类及mapper.xml文件时,显示执行postgresql数组字段对应的java属性类型为数组
<table tableName="product" domainObjectName="Product">
<columnOverride column="tag" javaType="java.lang.String[]"/>
</table>
3、在mapper.xml中显示数组字段指定处理类型typeHandler
<result property="tag" column="tag" typeHandler="com.iie.data.typehandler.ArrayTypeHandler"/>
4、第3不在resultMap中指定typeHandler只能在查询时生效,更新时,需要在对应的字段显示指定。
<update id="updateProduct" parameterType="Product">
update product set
tag = #{product.tag,typeHandler = com.iie.data.typehandler.ArrayTypeHandler},
where id = #{product.id}
</update>