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

結(jié)果集

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

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

ResultSet 接口的方法可細分為三類-

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

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

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

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

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

ResultSet 的類型

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

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

ResultSet 的并發(fā)性

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

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

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

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

導航結(jié)果集

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

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

將光標移動到第一行之前。

2 public void afterLast() throws SQLException

將光標移動到最后一行之后。

3 public boolean first() throws SQLException

將光標移動到第一行。

4 public void last() throws SQLException

將光標移動到最后一行。

5 public boolean absolute(int row) throws SQLException

將光標移動到指定的第 row 行。

6 public boolean relative(int row) throws SQLException

將光標移動到當前指向的位置往前或往后第 row 行的位置。

7 public boolean previous() throws SQLException

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

8 public boolean next() throws SQLException

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

9 public int getRow() throws SQLException

返回當前光標指向的行數(shù)的值。

10 public void moveToInsertRow() throws SQLException

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

11 public void moveToCurrentRow() throws SQLException

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

為了更好地理解,讓我們研究學習導航示例代碼

查看結(jié)果集

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

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

  • 一個需要列名。
  • 一個需要列的索引。

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

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

返回當前行中名為 columnName 的列的 int 值。

2 public int getInt(int columnIndex) throws SQLException

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

同樣的,在 ResultSet 接口中還有獲取八個 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 方法可以有兩個更新方法來更新任一數(shù)據(jù)類型-

  • 一個需要列名。
  • 一個需要列的索引。

例如,要更新一個結(jié)果集的當前行的 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

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

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

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

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

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

2 public void deleteRow()

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

3 public void refreshRow()

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

4 public void cancelRowUpdates()

取消對當前行的任何修改。

5 public void insertRow()

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