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

JDBC 基礎教學:ResultSet 物件完整指南——游標操作、資料型別轉換與大數據流處理

     編輯:Java 相關知識

前言:ResultSet 的核心角色

ResultSet 封裝 SQL 查詢結果集,維護游標指向當前資料列,透過 getXXX 方法存取欄位值。next() 移動游標至下一列,初始位於第一列之前。

範例查詢 SELECT a, b, c FROM Table1 產生表格:

a       b           c
12345   Cupertino   CA
83472   Redmond     WA
83492   Boston      MA

遍歷代碼範例:

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
    int i = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
    System.out.println("ROW = " + i + " " + s + " " + f);
}

一、資料列與游標

  • 游標初始在第一列前,首次 next() 移至第一列。
  • 游標僅向下移動 (JDBC 1.0),ResultSet 或父 Statement 關閉前持續有效。
  • SQL 游標具名稱,支援定位更新/刪除時需提供游標名 (getCursorName())。非所有 DBMS 支援,可用 DatabaseMetaData.supportsPositionedDelete/Update 檢查。

二、欄位存取

  • getXXX 可任意順序存取欄位,但**為可移植性建議從左至右、一次性讀取**。
  • 欄位識別:欄位名 (不分大小寫) 或欄位索引 (1-based)。
    rs.getString("title") ≡ rs.getString(2)
  • 同名欄位多於一個時,getXXX(String) 回傳第一個匹配值,**需用索引確保正確性**,效率亦略高。
  • 中繼資料:ResultSetMetaData meta = rs.getMetaData() 取得欄位數、型別、屬性。findColumn(String) 由名稱查索引。

三、資料型別轉換對照表

JDBC 驅動程式嘗試將資料庫型別轉換為指定 Java 型別。下表標示合法 (x) 與推薦 (X) 組合:

JDBC 型別 →CHARVARCHARLONGVARCHARNUMERICDECIMALBITTINYINTSMALLINTINTEGERBIGINTREALFLOATDOUBLEBINARYVARBINARYLONGVARBINARYDATETIMETIMESTAMP
getStringXXxxxxxxxxxxxxxxxx
getIntxxxxxxxxXxxxxxxxxx
getLongxxxxxxxxxXxxxxxxxx
getDoublexxxxxxxxxxxxXxxxxx
getBytesXXx
getDateXxx
getTimestampxxX
getAsciiStreamxxX
getBinaryStreamxxX
getObjectxxxxxxxxxxxxxxxxxxx

getObject 通用性最強,適用資料庫特有抽象型別或通用應用。

四、大數據流處理 (LONGVARCHAR/LONGVARBINARY)

getBytes/getString 受限於 Statement.getMaxFieldSize()。大數據建議用流分塊讀取:

  • getBinaryStream():原始位元組流
  • getAsciiStream():單位元組 ASCII 字元流
  • getUnicodeStream():雙位元組 Unicode 字元流

關鍵限制:流**必須立即讀取**,下一次 getXXX 呼叫會自動關閉前一流 (底層實作限制)。

範例:以 4KB 緩衝區讀取 ASCII 流:

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT x FROM Table2");
byte[] buff = new byte[4096];
while (rs.next()) {
    InputStream is = rs.getAsciiStream(1);
    int size;
    while ((size = is.read(buff)) != -1) {
        output.write(buff, 0, size);  // 輸出至 ASCII 目的地
    }
}

五、NULL 值處理

**必須先讀取欄位,再呼叫 wasNull() 判斷是否為 SQL NULL**:

  • 回傳 Java 物件的方法 (getString、getObject 等) → null
  • 基本型別方法 (getInt、getDouble 等) → 0
  • getBoolean → false

六、多結果集與可選結果集

預設用 executeQuery (單一 ResultSet) 或 executeUpdate (更新計數)。但預存程序可能回傳多個結果集/更新計數,或執行前不知是否有結果集。

通用機制:execute() + 三輔助方法:

  • getResultSet():取得當前結果集
  • getUpdateCount():取得當前更新計數
  • getMoreResults():移至下一結果,回傳 true 表示有結果集,false 表示有更新計數或無結果

ResultSet 隨產生它的 Statement 關閉、重新執行、或取得下一結果時自動關閉,無需手動關閉。

結語

掌握 ResultSet 游標模型、型別轉換規則、大數據流處理與 NULL 語意,是 JDBC 高效存取關係式資料的基石。多結果集機制雖少用,但支援複雜預存程序不可或缺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved