JDBC 結(jié)果集

2018-09-28 19:59 更新

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

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

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

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

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

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

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

ResultSet 的類型

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

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

ResultSet 的并發(fā)性

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

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

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

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

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

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

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

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

2public void afterLast() throws SQLException

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

3public boolean first() throws SQLException

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

4public void last() throws SQLException

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

5public boolean absolute(int row) throws SQLException

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

6public boolean relative(int row) throws SQLException

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

7public boolean previous() throws SQLException

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

8public boolean next() throws SQLException

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

9public int getRow() throws SQLException

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

10public void moveToInsertRow() throws SQLException

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

11public 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.方法 & 描述
1public int getInt(String columnName) throws SQLException

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

2public 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.方法 & 描述
1public void updateString(int columnIndex, String s) throws SQLException

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

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

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

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

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

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

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

2public void deleteRow()

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

3public void refreshRow()

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

4public void cancelRowUpdates()

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

5public void insertRow()

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號