JDBC - 結果集



讀取資料庫查詢資料的 SQL 語句將資料返回到結果集中。SELECT 語句是從資料庫中選擇行並將其顯示在結果集中的標準方法。java.sql.ResultSet 介面表示資料庫查詢的結果集。

ResultSet 物件維護一個指向結果集中當前行的遊標。術語“結果集”指的是 ResultSet 物件中包含的行和列資料。

ResultSet 介面的方法可以分為三類:

  • 導航方法 - 用於在結果集中移動遊標。

  • 獲取方法 - 用於檢視遊標指向的當前行中列的資料。

  • 更新方法 - 用於更新當前行中列的資料。這些更新也可以更新到底層資料庫中。

遊標是根據 ResultSet 的屬性可移動的。這些屬性在建立生成 ResultSet 的相應 Statement 時指定。

JDBC 提供以下連線方法來建立具有所需 ResultSet 的語句:

  • createStatement(int RSType, int RSConcurrency);

  • prepareStatement(String SQL, int RSType, int RSConcurrency);

  • prepareCall(String sql, int RSType, int RSConcurrency);

第一個引數指示 ResultSet 物件的型別,第二個引數是兩個 ResultSet 常量之一,用於指定結果集是隻讀還是可更新的。

ResultSet 型別

可能的 RSType 如下所示。如果未指定任何 ResultSet 型別,則將自動獲得一個 TYPE_FORWARD_ONLY 型別。

型別 描述
ResultSet.TYPE_FORWARD_ONLY 遊標只能在結果集中向前移動。
ResultSet.TYPE_SCROLL_INSENSITIVE 遊標可以向前和向後滾動,並且結果集對結果集建立後其他人對資料庫所做的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE. 遊標可以向前和向後滾動,並且結果集對結果集建立後其他人對資料庫所做的更改敏感。

ResultSet 的併發性

可能的 RSConcurrency 如下所示。如果未指定任何併發性型別,則將自動獲得一個 CONCUR_READ_ONLY 型別。

併發性 描述
ResultSet.CONCUR_READ_ONLY 建立一個只讀結果集。這是預設值
ResultSet.CONCUR_UPDATABLE 建立一個可更新的結果集。

到目前為止我們編寫的所有示例都可以按如下方式編寫,它初始化一個 Statement 物件以建立一個前向只讀 ResultSet 物件:

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

導航結果集

ResultSet 介面中包含多個涉及移動遊標的方法,包括:

序號 方法及描述
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

將遊標移動到指定的行。

6 public boolean relative(int row) throws SQLException

從遊標當前指向的位置向前或向後移動給定行數。

7 public boolean previous() throws SQLException

將遊標移動到前一行。如果前一行超出結果集,則此方法返回 false。

8 public boolean next() throws SQLException

將遊標移動到下一行。如果結果集中沒有更多行,則此方法返回 false。

9 public int getRow() throws SQLException

返回遊標指向的行號。

10 public void moveToInsertRow() throws SQLException

將遊標移動到結果集中一個特殊的行,該行可用於將新行插入到資料庫中。當前遊標位置會被記住。

11 public void moveToCurrentRow() throws SQLException

如果遊標當前位於插入行,則將遊標移回當前行;否則,此方法不執行任何操作。

為了更好地理解,讓我們學習導航 - 示例程式碼

檢視結果集

ResultSet 介面包含數十種用於獲取當前行資料的方法。

每種可能的資料型別都有一個 get 方法,每個 get 方法都有兩個版本:

  • 一個採用列名作為引數。

  • 一個採用列索引作為引數。

例如,如果您感興趣的列包含一個 int,則需要使用 ResultSet 的 getInt() 方法之一:

序號 方法及描述
1 public int getInt(String columnName) throws SQLException

返回 columnName 指定的列中當前行中的 int 值。

2 public int getInt(int columnIndex) throws SQLException

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

類似地,ResultSet 介面中為八種 Java 基本資料型別以及常見的型別(如 java.lang.String、java.lang.Object 和 java.net.URL)提供了 get 方法。

還有一些用於獲取 SQL 資料型別 java.sql.Date、java.sql.Time、java.sql.TimeStamp、java.sql.Clob 和 java.sql.Blob 的方法。請檢視文件以獲取有關使用這些 SQL 資料型別的更多資訊。

為了更好地理解,讓我們學習檢視 - 示例程式碼

更新結果集

ResultSet 介面包含一組用於更新結果集資料的方法。

與 get 方法一樣,每種資料型別都有兩個 update 方法:

  • 一個採用列名作為引數。

  • 一個採用列索引作為引數。

例如,要更新結果集當前行的 String 列,可以使用以下 updateString() 方法之一:

序號方法及描述
1public void updateString(int columnIndex, String s) throws SQLException

將指定列中的 String 值更改為 s 的值。

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

與上一個方法類似,只是列由其名稱而不是索引指定。

有八種基本資料型別以及 String、Object、URL 和 java.sql 包中的 SQL 資料型別的 update 方法。

更新結果集中的行會更改 ResultSet 物件中當前行的列,但不會更改底層資料庫中的相應行。要將您對行的更改更新到資料庫中,您需要呼叫以下方法之一。

序號 方法及描述
1 public void updateRow()

透過更新資料庫中的對應行來更新當前行。

2 public void deleteRow()

從資料庫中刪除當前行。

3 public void refreshRow()

重新整理結果集中的資料以反映資料庫中的任何最新更改。

4 public void cancelRowUpdates()

取消對當前行所做的任何更新。

5 public void insertRow()

將一行插入資料庫。此方法只能在遊標指向插入行時呼叫。

為了更好地理解,讓我們學習更新 - 示例程式碼

廣告