吉安感知网项目-后端
linwei
7 days ago 00fd093a15139a1ad5d8572999841ec71939d4bc
refactor(workorder): 替换JacksonTypeHandler为TextArrayTypeHandler

- 移除JacksonTypeHandler导入并替换为TextArrayTypeHandler
- 更新实体类中attachUrl字段的typeHandler配置
- 修改Mapper XML文件中的typeHandler引用
- 统一使用项目通用的TextArrayTypeHandler处理数组类型字段
1 files added
128 ■■■■■ changed files
drone-common/src/main/java/org/sxkj/common/handler/TextArrayTypeHandler.java 128 ●●●●● patch | view | raw | blame | history
drone-common/src/main/java/org/sxkj/common/handler/TextArrayTypeHandler.java
New file
@@ -0,0 +1,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;
    }
}