主頁 > 知識(shí)庫 > JDBCTM 指南:入門5 - ResultSet

JDBCTM 指南:入門5 - ResultSet

熱門標(biāo)簽:珠海銷售外呼系統(tǒng)運(yùn)營商 長春回?fù)芡夂粝到y(tǒng)廠家 外呼系統(tǒng)啥意思 地圖標(biāo)注創(chuàng)業(yè)項(xiàng)目入駐 廣州三五防封電銷卡 電銷外呼系統(tǒng) 排行榜 四川電信外呼系統(tǒng)靠譜嗎 地圖標(biāo)注制作道路 山東智能云外呼管理系統(tǒng)
5 - 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

Y
I

T S
M
A
L
L
I

T I

T
E
G
E
R B
I
G

N
T R
E
A
L F
L
O
A
T D
O
U

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

G
V
A
R
C
H
A
R B
I

A
R
Y V
A
R

I

A
R
Y L
O

G
V
A
R

I

A
R
Y D
A
T
E T
I
M
E T
I
M
E

T
A
M

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)閉。

標(biāo)簽:廣元 吳忠 玉樹 肇慶 紹興 北海 潮州 保定

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JDBCTM 指南:入門5 - ResultSet》,本文關(guān)鍵詞  JDBCTM,指南,入門,ResultSet,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JDBCTM 指南:入門5 - ResultSet》相關(guān)的同類信息!
  • 本頁收集關(guān)于JDBCTM 指南:入門5 - ResultSet的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章