鍍金池/ 教程/ Java/ 結(jié)果集
流數(shù)據(jù)
創(chuàng)建表實(shí)例
驅(qū)動(dòng)類型
簡介
數(shù)據(jù)類型
SQL語法
選擇數(shù)據(jù)庫實(shí)例
WHERE 子句實(shí)例
批處理
連接數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫實(shí)例
排序?qū)嵗?/span>
查詢記錄實(shí)例
刪除表實(shí)例
環(huán)境
刪除數(shù)據(jù)庫實(shí)例
存儲(chǔ)過程
異常
示例代碼
刪除記錄實(shí)例
更新記錄實(shí)例
結(jié)果集
事務(wù)
Statement 對(duì)象
插入記錄實(shí)例
LIKE 子句實(shí)例

結(jié)果集

SQL 語句從數(shù)據(jù)庫查詢中獲取數(shù)據(jù),并將數(shù)據(jù)返回到結(jié)果集中。SELECT 語句是一種標(biāo)準(zhǔn)的方法,它從一個(gè)數(shù)據(jù)庫中選擇行記錄,并顯示在一個(gè)結(jié)果集中。 java.sql.ResultSet 接口表示一個(gè)數(shù)據(jù)庫查詢的結(jié)果集。

一個(gè) ResultSet 對(duì)象控制一個(gè)光標(biāo)指向當(dāng)前行的結(jié)果集。術(shù)語“結(jié)果集”是指包含在 ResultSet 對(duì)象中的行和列的數(shù)據(jù)。

ResultSet 接口的方法可細(xì)分為三類-

  • 導(dǎo)航方法:用于移動(dòng)光標(biāo)。
  • 獲取方法:用于查看當(dāng)前行被光標(biāo)所指向的列中的數(shù)據(jù)。
  • 更新方法:用于更新當(dāng)前行的列中的數(shù)據(jù)。這些更新也會(huì)更新數(shù)據(jù)庫中的數(shù)據(jù)。

光標(biāo)的移動(dòng)基于 ResultSet 的屬性。用相應(yīng)的語句生成 ResultSet 對(duì)象時(shí),同時(shí)生成 ResultSet 的屬性。

JDBC 提供了連接方法通過下列創(chuàng)建語句來生成你所需的 ResultSet 對(duì)象:

  • createStatement(int RSType, int RSConcurrency);
  • prepareStatement(String SQL, int RSType, int RSConcurrency);
  • prepareCall(String sql, int RSType, int RSConcurrency);

第一個(gè)參數(shù)表示 ResultSet 對(duì)象的類型,第二個(gè)參數(shù)是兩個(gè) ResultSet 常量之一,該常量用于判斷該結(jié)果集是只讀的還是可修改的。

ResultSet 的類型

可能的 RSType 如下所示。如果你不指定 ResultSet 類型,將自動(dòng)獲得的值是 TYPE_FORWARD_ONLY。

類型 描述
ResultSet.TYPE_FORWARD_ONLY 光標(biāo)只能在結(jié)果集中向前移動(dòng)。
ResultSet.TYPE_SCROLL_INSENSITIVE 光標(biāo)可以向前和向后移動(dòng)。當(dāng)結(jié)果集創(chuàng)建后,其他人對(duì)數(shù)據(jù)庫的操作不會(huì)影響結(jié)果集的數(shù)據(jù)。
ResultSet.TYPE_SCROLL_SENSITIVE. 光標(biāo)可以向前和向后移動(dòng)。當(dāng)結(jié)果集創(chuàng)建后,其他人對(duì)數(shù)據(jù)庫的操作會(huì)影響結(jié)果集的數(shù)據(jù)。

ResultSet 的并發(fā)性

RSConcurrency 的值如下所示,如果你不指定并發(fā)類型,將自動(dòng)獲得的值是 CONCUR_READ_ONLY。

并發(fā)性 描述
ResultSet.CONCUR_READ_ONLY 創(chuàng)建一個(gè)只讀結(jié)果集,這是默認(rèn)的值。
ResultSet.CONCUR_UPDATABLE 創(chuàng)建一個(gè)可修改的結(jié)果集。

到目前為止我們的示例可以如下所示,可以寫成初始化一個(gè) Statement 對(duì)象來創(chuàng)建一個(gè)只能前進(jìn),而且只讀的 ResultSet 對(duì)象-

try {
   Statement stmt = conn.createStatement(
                           ResultSet.TYPE_FORWARD_ONLY,
                           ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
   ....
}
finally {
   ....
}

導(dǎo)航結(jié)果集

在 ResultSet 接口中包括如下幾種方法涉及移動(dòng)光標(biāo)-

S.N. 方法 & 描述
1 public void beforeFirst() throws SQLException

將光標(biāo)移動(dòng)到第一行之前。

2 public void afterLast() throws SQLException

將光標(biāo)移動(dòng)到最后一行之后。

3 public boolean first() throws SQLException

將光標(biāo)移動(dòng)到第一行。

4 public void last() throws SQLException

將光標(biāo)移動(dòng)到最后一行。

5 public boolean absolute(int row) throws SQLException

將光標(biāo)移動(dòng)到指定的第 row 行。

6 public boolean relative(int row) throws SQLException

將光標(biāo)移動(dòng)到當(dāng)前指向的位置往前或往后第 row 行的位置。

7 public boolean previous() throws SQLException

將光標(biāo)移動(dòng)到上一行,如果超過結(jié)果集的范圍則返回 false。

8 public boolean next() throws SQLException

將光標(biāo)移動(dòng)到下一行,如果是結(jié)果集的最后一行則返回 false。

9 public int getRow() throws SQLException

返回當(dāng)前光標(biāo)指向的行數(shù)的值。

10 public void moveToInsertRow() throws SQLException

將光標(biāo)移動(dòng)到結(jié)果集中指定的行,可以在數(shù)據(jù)庫中插入新的一行。當(dāng)前光標(biāo)位置將被記住。

11 public void moveToCurrentRow() throws SQLException

如果光標(biāo)處于插入行,則將光標(biāo)返回到當(dāng)前行,其他情況下,這個(gè)方法不執(zhí)行任何操作。

為了更好地理解,讓我們研究學(xué)習(xí)導(dǎo)航示例代碼。

查看結(jié)果集

ResultSet接口中含有幾十種從當(dāng)前行獲取數(shù)據(jù)的方法。

每個(gè)可能的數(shù)據(jù)類型都有一個(gè) get 方法,并且每個(gè) get 方法有兩個(gè)版本-

  • 一個(gè)需要列名。
  • 一個(gè)需要列的索引。

例如,如果你想查看的列包含一個(gè) int 類型,你需要在 ResultSet 中調(diào)用 getInt()方法-

S.N. 方法 & 描述
1 public int getInt(String columnName) throws SQLException

返回當(dāng)前行中名為 columnName 的列的 int 值。

2 public int getInt(int columnIndex) throws SQLException

返回當(dāng)前行中指定列的索引的 int 值。列索引從 1 開始,意味著行中的第一列是 1 ,第二列是 2 ,以此類推。

同樣的,在 ResultSet 接口中還有獲取八個(gè) Java 原始類型的 get 方法,以及常見的類型,比如 java.lang.String,java.lang.Object 和 java.net.URL。

也有用于獲取 SQL 數(shù)據(jù)類型 java.sql.Date, java.sql.Time, java.sql.Timestamp, java.sql.Clob,java.sql.Blob 中的方法。查看文檔可以了解使用這些 SQL 數(shù)據(jù)類型的更多的信息。

更新的結(jié)果集

ResultSet 接口包含了一系列的更新方法,該方法用于更新結(jié)果集中的數(shù)據(jù)。

用 get 方法可以有兩個(gè)更新方法來更新任一數(shù)據(jù)類型-

  • 一個(gè)需要列名。
  • 一個(gè)需要列的索引。

例如,要更新一個(gè)結(jié)果集的當(dāng)前行的 String 列,你可以使用任一如下所示的 updateString()方法-

S.N. 方法 & 描述
1 public void updateString(int columnIndex, String s) throws SQLException

將指定列的字符串的值改為 s。

2 public void updateString(String columnName, String s) throws SQLException

類似于前面的方法,不同之處在于指定的列是用名字來指定的,而不是它的索引。

八個(gè)原始數(shù)據(jù)類型都有其更新方法,比如 String,Object,URL,和在 java.sql 包中的 SQL 數(shù)據(jù)類型。

更新結(jié)果集中的行將改變當(dāng)前行的列中的 ResultSet 對(duì)象,而不是基礎(chǔ)數(shù)據(jù)庫中的數(shù)據(jù)。要更新數(shù)據(jù)庫中一行的數(shù)據(jù),你需要調(diào)用以下的任一方法-

S.N. 方法 & 描述
1 public void updateRow()

通過更新數(shù)據(jù)庫中相對(duì)應(yīng)的行來更新當(dāng)前行。

2 public void deleteRow()

從數(shù)據(jù)庫中刪除當(dāng)前行。

3 public void refreshRow()

在結(jié)果集中刷新數(shù)據(jù),以反映數(shù)據(jù)庫中最新的數(shù)據(jù)變化。

4 public void cancelRowUpdates()

取消對(duì)當(dāng)前行的任何修改。

5 public void insertRow()

在數(shù)據(jù)庫中插入一行。本方法只有在光標(biāo)指向插入行的時(shí)候才能被調(diào)用。