- JDBC 教程
- JDBC - 首頁
- JDBC - 簡介
- JDBC - SQL 語法
- JDBC - 環境
- JDBC - 示例程式碼
- JDBC - 驅動程式型別
- JDBC - 連線
- JDBC - 語句
- JDBC - 結果集
- JDBC - 資料型別
- JDBC - 事務
- JDBC - 異常
- JDBC - 批處理
- JDBC - 儲存過程
- JDBC - 資料流
- JDBC - RowSet
- JDBC - 複製資料庫
- JDBC - ACID 屬性
- JDBC - 連線池
- JDBC 示例
- JDBC - 建立資料庫
- JDBC - 選擇資料庫
- JDBC - 刪除資料庫
- JDBC - 建立表
- JDBC - 刪除表
- JDBC - 插入記錄
- JDBC - 選擇記錄
- JDBC - 更新記錄
- JDBC - 刪除記錄
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 資料排序
- JDBC 有用資源
- JDBC - 常見問題解答
- JDBC - 快速指南
- JDBC - 有用資源
- JDBC - 討論
- 有用 - Java 教程
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() 方法之一:
| 序號 | 方法及描述 |
|---|---|
| 1 | public 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()
將一行插入資料庫。此方法只能在遊標指向插入行時呼叫。 |
為了更好地理解,讓我們學習更新 - 示例程式碼。