吉安感知网项目-后端
linwei
8 days ago 00fd093a15139a1ad5d8572999841ec71939d4bc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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&lt;String&gt; 之间的转换
 * </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;
    }
}