package org.sxkj.common.handler; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedTypes; import java.sql.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 人大金仓/PostgreSQL text[] 数组类型处理器 *

* 用于处理数据库中的 text[] 类型字段与 Java List<String> 之间的转换 *

* * @author system * @since 2026-07-30 */ @MappedTypes(List.class) public class TextArrayTypeHandler extends BaseTypeHandler> { /** * 设置非空参数 *

* 步骤: * 1. 处理空列表情况 * 2. 构建 PostgreSQL 数组格式字符串 * 3. 使用 createArrayOf 创建数组对象 *

* * @param ps PreparedStatement * @param i 参数索引 * @param parameter 参数值 * @param jdbcType JDBC类型 * @throws SQLException SQL异常 */ @Override public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { // 1. 处理空列表情况 if (parameter == null || parameter.isEmpty()) { // 使用空数组 Array array = ps.getConnection().createArrayOf("text", new Object[0]); ps.setArray(i, array); return; } // 2. 构建 PostgreSQL 数组格式 Object[] elements = parameter.toArray(); // 3. 使用 createArrayOf 创建数组对象 Array array = ps.getConnection().createArrayOf("text", elements); ps.setArray(i, array); } /** * 根据列名获取可空结果 * * @param rs ResultSet * @param columnName 列名 * @return 字符串列表 * @throws SQLException SQL异常 */ @Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException { return parseArray(rs.getArray(columnName)); } /** * 根据列索引获取可空结果 * * @param rs ResultSet * @param columnIndex 列索引 * @return 字符串列表 * @throws SQLException SQL异常 */ @Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return parseArray(rs.getArray(columnIndex)); } /** * 从 CallableStatement 获取可空结果 * * @param cs CallableStatement * @param columnIndex 列索引 * @return 字符串列表 * @throws SQLException SQL异常 */ @Override public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return parseArray(cs.getArray(columnIndex)); } /** * 解析数据库数组为字符串列表 *

* 步骤: * 1. 处理空数组情况 * 2. 获取数组元素 * 3. 转换为字符串列表 *

* * @param array 数据库数组对象 * @return 字符串列表 * @throws SQLException SQL异常 */ private List parseArray(Array array) throws SQLException { // 1. 处理空数组情况 if (array == null) { return Collections.emptyList(); } // 2. 获取数组元素 Object[] objArray = (Object[]) array.getArray(); if (objArray == null || objArray.length == 0) { return Collections.emptyList(); } // 3. 转换为字符串列表 List result = new ArrayList<>(objArray.length); for (Object obj : objArray) { result.add(obj != null ? obj.toString() : null); } return result; } }