JDBC基礎(chǔ)教程之ResultSet對象

字號:

概述
    ResultSet 包含符合 SQL 語句中條件的所有行,并且它通過一套 get 方法(這些 get 方法可以訪問當(dāng)前行中的不同列)提供了對這些行中數(shù)據(jù)的訪問。ResultSet.next 方法用于移動到 ResultSet 中的下一行,使下一行成為當(dāng)前行。
    結(jié)果集一般是一個表,其中有查詢所返回的列標(biāo)題及相應(yīng)的值。例如,如果查詢?yōu)?SELECT a, b, c FROM Table1,則結(jié)果集將具有如下形式:
    a b c
    -------- --------- --------
    12345 Cupertino CA
    83472 Redmond WA
    83492 Boston MA
    下面的代碼段是執(zhí)行 SQL 語句的示例。該 SQL 語句將返回行集合,其中列 1 為 int,列 2 為 String,而列 3 則為字節(jié)數(shù)組:
    Java.sql.Statement stmt = conn.createStatement();
    ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
    while (r.next())
    {
    // 打印當(dāng)前行的值。
    int i = r.getInt("a");
    String s = r.getString("b");
    float f = r.getFloat("c");
    System.out.println("ROW = " + i + " " + s + " " + f);
    }
    1、行和光標(biāo)
    ResultSet 維護指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。每調(diào)用一次 next 方法,光標(biāo)向下移動一行。最初它位于第一行之前,因此第一次調(diào)用 next 將把光標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用 next 導(dǎo)致光標(biāo)向下移動一行,按照從上至下的次序獲取ResultSet 行。
    在 ResultSet 對象或其父輩 Statement 對象關(guān)閉之前,光標(biāo)一直保持有效。
    在 SQL 中,結(jié)果表的光標(biāo)是有名字的。如果數(shù)據(jù)庫允許定位更新或定位刪除,則需要將光標(biāo)的名字作為參數(shù)提供給更新或刪除命令??赏ㄟ^調(diào)用方法getCursorName 獲得光標(biāo)名。
    注意:不是所有的 DBMS 都支持定位更新和刪除??墒褂?DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法來檢查特定連接是否支持這些操作。當(dāng)支持這些操作時,DBMS/驅(qū)動程序必須確保適當(dāng)鎖定選定行,以使定位更新不會導(dǎo)致更新異常或其它并發(fā)問題。
    2、列
    方法 getXXX 提供了獲取當(dāng)前行中某列值的途徑。在每一行內(nèi),可按任何次序獲取列值。但為了保證可移植性,應(yīng)該從左至右獲取列值,并且一次性地讀取列值。列名或列號可用于標(biāo)識要從中獲取數(shù)據(jù)的列。例如,如果 ResultSet 對象 rs 的第二列名為“title”,并將值存儲為字符串,則下列任一代碼將獲取存儲在該列中的值:
    String s = rs.getString("title");
    String s = rs.getString(2);
    注意列是從左至右編號的,并且從列 1 開始。同時,用作 getXXX 方法的輸入的列名不區(qū)分大小寫。
    提供使用列名這個選項的目的是為了讓在查詢中指定列名的用戶可使用相同的名字作為 getXXX 方法的參數(shù)。另一方面,如果 select 語句未指定列名(例如在“select * from table1”中或列是導(dǎo)出的時),則應(yīng)該使用列號。這些情況下,
    戶將無法確切知道列名。
    有些情況下,SQL 查詢返回的結(jié)果集中可能有多個列具有相同的名字。如果列名用作 getXXX 方法的參數(shù),則 getXXX 將返回第一個匹配列名的值。因而,如果多個列具有相同的名字,則需要使用列索引來確保檢索了正確的列值。這時,使用列號效率要稍微高一些。
    關(guān)于 ResultSet 中列的信息,可通過調(diào)用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 對象將給出其 ResultSet 對象各列的編號、類型和屬性。
    如果列名已知,但不知其索引,則可用方法 findColumn 得到其列號。
    3、數(shù)據(jù)類型和轉(zhuǎn)換
    對于 getXXX 方法,JDBC 驅(qū)動程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定 Java 類型,然后返回適合的 Java 值。例如,如果 getXXX 方法為 getString,而基本數(shù)據(jù)庫中數(shù)據(jù)類型為 VARCHAR,則 JDBC 驅(qū)動程序?qū)?VARCHAR 轉(zhuǎn)換成 Java String。getString 的返回值將為 Java String 對象。
    下表顯示了允許用 getXXX 獲取的 JDBC 類型及推薦用它獲取的 JDBC 類型(通用SQL 類型)。小寫的 x 表示允許 getXXX 方法獲取該數(shù)據(jù)類型;大寫的 X 表示對該數(shù)據(jù)類型推薦使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用來獲取 LONGVARCHAR 值,但是推薦根據(jù)返回的數(shù)據(jù)類型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 將任何數(shù)據(jù)類型返回為 Java Object。當(dāng)基本數(shù)據(jù)類型是特定于數(shù)據(jù)庫的抽象類型或當(dāng)通用應(yīng)用程序需要接受任何數(shù)據(jù)類型時,它是非常有用的。
    可使用 ResultSet.getXXX 方法獲取常見的 JDBC 數(shù)據(jù)類型。
    “x”表示該 getXXX 方法可合法地用于獲取給定 JDBC 類型。
    “X”表示推薦使用該 getXXX 方法來獲取給定 JDBC 類型。
    getByte X x x x x x x x x x x x x            
    getShort x X x x x x x x x x x x x            
    getInt x x X x x x x x x x x x x            
    getLong x x x X x x x x x x x x x            
    getFloat x x x x X x x x x x x x x            
    getDouble x x x x x X X x x x x x x            
    getBigDecimal x x x x x x x X X x x x x            
    getBoolean x x x x x x x x x X x x x            
    getString x x x x x x x x x x X X x x x x x x x
    getBytes                           X X x      
    getDate                     x x x       X   x
    getTime                     x x x         X x
    getTimestamp                     x x x       x   X
    getAsciiStream                     x x X x x x      
    getUnicodeStream                     x x X x x x      
    getBinaryStream                           x x X      
    getObject x x x x x x x x x x x x x x x x x x x