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;
|
}
|
}
|