| New file |
| | |
| | | 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[] 数组类型处理器 |
| | | * <p> |
| | | * 用于处理数据库中的 text[] 类型字段与 Java List<String> 之间的转换 |
| | | * </p> |
| | | * |
| | | * @author system |
| | | * @since 2026-07-30 |
| | | */ |
| | | @MappedTypes(List.class) |
| | | public class TextArrayTypeHandler extends BaseTypeHandler<List<String>> { |
| | | |
| | | /** |
| | | * 设置非空参数 |
| | | * <p> |
| | | * 步骤: |
| | | * 1. 处理空列表情况 |
| | | * 2. 构建 PostgreSQL 数组格式字符串 |
| | | * 3. 使用 createArrayOf 创建数组对象 |
| | | * </p> |
| | | * |
| | | * @param ps PreparedStatement |
| | | * @param i 参数索引 |
| | | * @param parameter 参数值 |
| | | * @param jdbcType JDBC类型 |
| | | * @throws SQLException SQL异常 |
| | | */ |
| | | @Override |
| | | public void setNonNullParameter(PreparedStatement ps, int i, List<String> 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<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { |
| | | return parseArray(rs.getArray(columnName)); |
| | | } |
| | | |
| | | /** |
| | | * 根据列索引获取可空结果 |
| | | * |
| | | * @param rs ResultSet |
| | | * @param columnIndex 列索引 |
| | | * @return 字符串列表 |
| | | * @throws SQLException SQL异常 |
| | | */ |
| | | @Override |
| | | public List<String> 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<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { |
| | | return parseArray(cs.getArray(columnIndex)); |
| | | } |
| | | |
| | | /** |
| | | * 解析数据库数组为字符串列表 |
| | | * <p> |
| | | * 步骤: |
| | | * 1. 处理空数组情况 |
| | | * 2. 获取数组元素 |
| | | * 3. 转换为字符串列表 |
| | | * </p> |
| | | * |
| | | * @param array 数据库数组对象 |
| | | * @return 字符串列表 |
| | | * @throws SQLException SQL异常 |
| | | */ |
| | | private List<String> 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<String> result = new ArrayList<>(objArray.length); |
| | | for (Object obj : objArray) { |
| | | result.add(obj != null ? obj.toString() : null); |
| | | } |
| | | return result; |
| | | } |
| | | } |