<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JDBC系列教程(四)---結(jié)果設(shè)置

    ResultSet
    本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來的。JavaSoft 目前正在準(zhǔn)備這本書。這是一本教程,同時(shí)也是 JDBC 的重要參考手冊(cè),它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。?

    5.1 概述
    ResultSet 包含符合 SQL 語句中條件的所有行,并且它通過一套 get 方法(這些 get 方法可以訪問當(dāng)前行中的不同列)提供了對(duì)這些行中數(shù)據(jù)的訪問。ResultSet.next 方法用于移動(dòng)到 ResultSet 中的下一行,使下一行成為當(dāng)前行。

    結(jié)果集一般是一個(gè)表,其中有查詢所返回的列標(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);
    }

    5.1.1 行和光標(biāo)
    ResultSet 維護(hù)指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。每調(diào)用一次 next 方法,光標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用 next 將把光標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用 next 導(dǎo)致光標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取 ResultSet 行。

    在 ResultSet 對(duì)象或其父輩 Statement 對(duì)象關(guān)閉之前,光標(biāo)一直保持有效。

    在 SQL 中,結(jié)果表的光標(biāo)是有名字的。如果數(shù)據(jù)庫允許定位更新或定位刪除,則需要將光標(biāo)的名字作為參數(shù)提供給更新或刪除命令。可通過調(diào)用方法 getCursorName 獲得光標(biāo)名。

    注意:不是所有的 DBMS 都支持定位更新和刪除。可使用 DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法來檢查特定連接是否支持這些操作。當(dāng)支持這些操作時(shí),DBMS/驅(qū)動(dòng)程序必須確保適當(dāng)鎖定選定行,以使定位更新不會(huì)導(dǎo)致更新異常或其它并發(fā)問題。


    5.1.2 列
    方法 getXXX 提供了獲取當(dāng)前行中某列值的途徑。在每一行內(nèi),可按任何次序獲取列值。但為了保證可移植性,應(yīng)該從左至右獲取列值,并且一次性地讀取列值。

    列名或列號(hào)可用于標(biāo)識(shí)要從中獲取數(shù)據(jù)的列。例如,如果 ResultSet 對(duì)象 rs 的第二列名為“title”,并將值存儲(chǔ)為字符串,則下列任一代碼將獲取存儲(chǔ)在該列中的值:?

    String s = rs.getString("title");
    String s = rs.getString(2);

    注意列是從左至右編號(hào)的,并且從列 1 開始。同時(shí),用作 getXXX 方法的輸入的列名不區(qū)分大小寫。

    提供使用列名這個(gè)選項(xiàng)的目的是為了讓在查詢中指定列名的用戶可使用相同的名字作為 getXXX 方法的參數(shù)。另一方面,如果 select 語句未指定列名(例如在“select * from table1”中或列是導(dǎo)出的時(shí)),則應(yīng)該使用列號(hào)。這些情況下,用戶將無法確切知道列名。

    有些情況下,SQL 查詢返回的結(jié)果集中可能有多個(gè)列具有相同的名字。如果列名用作 getXXX 方法的參數(shù),則 getXXX 將返回第一個(gè)匹配列名的值。因而,如果多個(gè)列具有相同的名字,則需要使用列索引來確保檢索了正確的列值。這時(shí),使用列號(hào)效率要稍微高一些。

    關(guān)于 ResultSet 中列的信息,可通過調(diào)用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 對(duì)象將給出其 ResultSet 對(duì)象各列的編號(hào)、類型和屬性。

    如果列名已知,但不知其索引,則可用方法 findColumn 得到其列號(hào)。


    5.1.3 數(shù)據(jù)類型和轉(zhuǎn)換
    對(duì)于 getXXX 方法,JDBC 驅(qū)動(dòng)程序試圖將基本數(shù)據(jù)轉(zhuǎn)換成指定 Java 類型,然后返回適合的 Java 值。例如,如果 getXXX 方法為 getString,而基本數(shù)據(jù)庫中數(shù)據(jù)類型為 VARCHAR,則 JDBC 驅(qū)動(dòng)程序?qū)?VARCHAR 轉(zhuǎn)換成 Java String。getString 的返回值將為 Java String 對(duì)象。

    下表顯示了允許用 getXXX 獲取的 JDBC 類型及推薦用它獲取的 JDBC 類型(通用 SQL 類型)。小寫的 x 表示允許 getXXX 方法獲取該數(shù)據(jù)類型;大寫的 X 表示對(duì)該數(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ù)類型時(shí),它是非常有用的。

    可使用 ResultSet.getXXX 方法獲取常見的 JDBC 數(shù)據(jù)類型。

    “x”表示該 getXXX 方法可合法地用于獲取給定 JDBC 類型。

    “X”表示推薦使用該 getXXX 方法來獲取給定 JDBC 類型。

      T
    I
    N
    Y
    I
    N
    T S
    M
    A
    L
    L
    I
    N
    T I
    N
    T
    E
    G
    E
    R B
    I
    G

    N
    T R
    E
    A
    L F
    L
    O
    A
    T D
    O
    U
    B
    L
    E D
    E
    C
    I
    M
    A
    L N
    U
    M
    E
    R
    I
    C B
    I
    T C
    H
    A
    R V
    A
    R
    C
    H
    A
    R
    L
    O
    N
    G
    V
    A
    R
    C
    H
    A
    R B
    I
    N
    A
    R
    Y V
    A
    R
    B
    I
    N
    A
    R
    Y L
    O
    N
    G
    V
    A
    R
    B
    I
    N
    A
    R
    Y D
    A
    T
    E T
    I
    M
    E T
    I
    M
    E
    S
    T
    A
    M
    P?
    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?


    5.1.4 對(duì)非常大的行值使用流
    ResultSet 可以獲取任意大的 LONGVARBINARY 或 LONGVARCHAR 數(shù)據(jù)。方法 getBytes 和 getString 將數(shù)據(jù)返回為大的塊(最大為 Statement.getMaxFieldSize 的返回值)。但是,以較小的固定塊獲取非常大的數(shù)據(jù)可能會(huì)更方便,而這可通過讓 ResultSet 類返回 java.io.Input 流來完成。從該流中可分塊讀取數(shù)據(jù)。注意:必須立即訪問這些流,因?yàn)樵谙乱淮螌?duì) ResultSet 調(diào)用 getXXX 時(shí)它們將自動(dòng)關(guān)閉(這是由于基本實(shí)現(xiàn)對(duì)大塊數(shù)據(jù)訪問有限制)。?

    JDBC API 具有三個(gè)獲取流的方法,分別具有不同的返回值:?


    getBinaryStream 返回只提供數(shù)據(jù)庫原字節(jié)而不進(jìn)行任何轉(zhuǎn)換的流。


    getAsciiStream 返回提供單字節(jié) ASCII 字符的流。


    getUnicodeStream 返回提供雙字節(jié) Unicode 字符的流。


    注意:它不同于 Java 流,后者返回?zé)o類型字節(jié)并可(例如)通用于 ASCII 和 Unicode 字符。

    下列代碼演示了 getAsciiStream 的用法:?

    java.sql.Statement stmt = con.createStatement();
    ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
    // 現(xiàn)在以 4K 塊大小獲取列 1 結(jié)果:
    byte buff = new byte[4096];
    while (r.next()) {
    Java.io.InputStream fin = r.getAsciiStream(1);
    for (;;) {
    int size = fin.read(buff);
    if (size == -1) { // 到達(dá)流末尾
    break;
    }
    // 將新填充的緩沖區(qū)發(fā)送到 ASCII 輸出流:
    output.write(buff, 0, size);
    }
    }

    5.1.5 NULL 結(jié)果值
    要確定給定結(jié)果值是否是 JDBC NULL,必須先讀取該列,然后使用 ResultSet.wasNull 方法檢查該次讀取是否返回 JDBC NULL。

    當(dāng)使用 ResultSet.getXXX 方法讀取 JDBC NULL 時(shí),方法 wasNull 將返回下列值之一:?


    Java null 值:對(duì)于返回 Java 對(duì)象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。


    零值:對(duì)于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。


    false 值:對(duì)于 getBoolean。


    5.1.6 可選結(jié)果集或多結(jié)果集
    通常使用 executeQuery(它返回單個(gè) ResultSet)或 executeUpdate(它可用于任何數(shù)據(jù)庫修改語句,并返回更新行數(shù))可執(zhí)行 SQL 語句。但有些情況下,應(yīng)用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲(chǔ)過程可能返回幾個(gè)不同的結(jié)果集和/或更新計(jì)數(shù)。

    為了適應(yīng)這些情況,JDBC 提供了一種機(jī)制,允許應(yīng)用程序執(zhí)行語句,然后處理由結(jié)果集和更新計(jì)數(shù)組成的任意集合。這種機(jī)制的原理是首先調(diào)用一個(gè)完全通用的 execute 方法,然后調(diào)用另外三個(gè)方法,getResultSet、getUpdateCount 和 getMoreResults。這些方法允許應(yīng)用程序一次一個(gè)地研究語句結(jié)果,并確定給定結(jié)果是 ResultSet 還是更新計(jì)數(shù)。

    用戶不必關(guān)閉 ResultSet;當(dāng)產(chǎn)生它的 Statement 關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該 ResultSet 將被 Statement 自動(dòng)關(guān)閉。?



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630447

    posts - 4, comments - 5, trackbacks - 0, articles - 60

    Copyright © ikingqu

    主站蜘蛛池模板: 免费在线不卡视频| 国内精品乱码卡1卡2卡3免费| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲视频免费播放| 国产精品高清视亚洲一区二区| 色妞www精品视频免费看| 99re6在线视频精品免费| 亚洲精品国产免费| 日韩成人在线免费视频| 亚洲精品亚洲人成人网| 亚洲综合国产成人丁香五月激情| 九九视频高清视频免费观看| 日韩在线永久免费播放| 亚洲av无码成人精品区在线播放 | 亚洲熟妇AV乱码在线观看| 成年女人看片免费视频播放器| 国产精品亚洲精品日韩已方| 亚洲精品日韩中文字幕久久久| 香蕉视频在线观看免费| 亚洲精品一级无码鲁丝片| 亚洲精品V天堂中文字幕| 国产午夜精品免费一区二区三区| 成人免费视频一区| 香蕉视频在线观看免费| 亚洲爆乳无码专区| 又大又硬又粗又黄的视频免费看| 操美女视频免费网站| 麻豆69堂免费视频| 亚洲一区影音先锋色资源| jizz在线免费播放| 国产精品免费一级在线观看| 亚洲伊人久久大香线蕉影院| 久久国产乱子精品免费女| 亚洲乱码一二三四区国产| 国产三级免费电影| 亚洲国产精品18久久久久久| 国产综合精品久久亚洲| 亚洲av无码无线在线观看| 人禽杂交18禁网站免费| 亚洲国产成人久久| 亚洲AV中文无码乱人伦在线视色|