| 方法 | 說明 |
getArray() | 返回 Java 數組對象(元素為默認映射類型) |
getArray(Map<String,Class<?>> map) | 指定類型映射表返回 Java 數組 |
getResultSet() | 返回 ResultSet,每行一個元素(索引、值) |
getResultSet(Map<String,Class<?>> map) | 自定義映射的 ResultSet 版本 |
getBaseType() | 返回元素的 SQL 類型碼 |
getBaseTypeName() | 返回元素的數據庫類型名稱 |
讀取數組字段實戰
// 假設表: CREATE TABLE t_arr (id INT, nums INT[]);
String sql = "SELECT nums FROM t_arr WHERE id = ?";
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 1);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
Array sqlArray = rs.getArray("nums");
// 方式一:直接獲取 Java 數組
Integer[] arr = (Integer[]) sqlArray.getArray();
System.out.println(Arrays.toString(arr));
// 方式二:獲取 ResultSet 逐行處理
try (ResultSet elementRs = sqlArray.getResultSet()) {
while (elementRs.next()) {
int idx = elementRs.getInt(1); // 索引 (1-based)
int val = elementRs.getInt(2); // 值
System.out.printf("[%d]=%d%n", idx, val);
}
}
}
}
}
寫入數組參數
String[] tags = {"java", "sql", "array"};
// 創建數組對象(需數據庫支持 createArrayOf)
Array sqlArray = conn.createArrayOf("VARCHAR", tags);
String sql = "INSERT INTO articles(title, tags) VALUES (?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "Java Array Guide");
ps.setArray(2, sqlArray);
ps.executeUpdate();
}
注意:createArrayOf 是 JDBC 4.0+ 引入,PostgreSQL、H2、Oracle 支持良好;MySQL 8.0 仍無原生 ARRAY 類型,需用 JSON 替代。
UDT 元素自定義映射
場景
數據庫定義 CREATE TYPE addr AS (city VARCHAR, zip INT);,表字段 addresses addr[]。
兩步走
- 實現
SQLData 接口
public class Address implements SQLData {
private String city;
private int zip;
private String sqlType;
@Override public String getSQLTypeName() { return sqlType; }
@Override public void readSQL(SQLInput stream, String typeName) throws SQLException {
this.sqlType = typeName;
this.city = stream.readString();
this.zip = stream.readInt();
}
@Override public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeString(city);
stream.writeInt(zip);
}
// getter/setter/toString
}
- 註冊類型映射
Map> map = conn.getTypeMap();
map.put("MYSCHEMA.ADDRESS", Address.class);
conn.setTypeMap(map);
之後 getArray(map) / getResultSet(map) 即可自動映射為 Address[]。
避坑指南
- Locator 語義:默認
Array 是邏輯指針,數據在服務端,調用 getArray() 才會網絡傳輸
- 資源釋放:
Array.free() (JDBC 4.1+) 釋放服務端資源,防洩漏
- MySQL 無 ARRAY:改用
JSON 字段 + JSON_TABLE / 應用層解析
- 大數組性能:優先
getResultSet() 流式處理,避免一次性載入巨大數組 OOM
總結
java.sql.Array 為數據庫數組類型提供了標準化訪問路徑,配合 SQLData 可無縫映射複雜 UDT。實際項目中,優先確認目標數據庫對 ARRAY 類型的支持程度再決策技術方案。
- 上一篇文章: Java Web 核心:轉發 vs 重定向 —— 原理、差異與選型指南
- 下一篇文章: 零基礎寫 Java 知乎爬蟲:從環境搭建到反爬對抗全流程實戰
Copyright ©
程式碼之家 All Rights Reserved