首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java SQL Array 接口詳解:數據庫數組類型映射與自定義類型策略

     編輯:Java 相關知識

定位

java.sql.Array 是 JDBC 規範中對應 SQL ARRAY 類型的標準映射接口,主要用於:

  • 將數據庫數組字段讀取為 Java 數組或 ResultSet
  • 向數據庫寫入數組參數
  • 支持元素為 UDT(用戶定義類型)時的自定義映射

核心方法速覽

讀取數組字段實戰

// 假設表: 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[]。

兩步走

  1. 實現 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
    }
    
  2. 註冊類型映射
    
    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 類型的支持程度再決策技術方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法說明
getArray()返回 Java 數組對象(元素為默認映射類型)
getArray(Map<String,Class<?>> map)指定類型映射表返回 Java 數組
getResultSet()返回 ResultSet,每行一個元素(索引、值)
getResultSet(Map<String,Class<?>> map)自定義映射的 ResultSet 版本
getBaseType()返回元素的 SQL 類型碼
getBaseTypeName()返回元素的數據庫類型名稱