JDBC結果集Result/Sets
從數據庫查詢讀取數據的SQL語句返回的結果集的數據。 SELECT語句的標準方法來選擇從一個數據庫中的行並查來在一個結果集。java.sql.ResultSet接口表示一個數據庫查詢的結果集。
一個ResultSet對象維護一個遊標指向當前行的結果集。術語“結果集”是指包含在ResultSet對象中的行和列的數據。
ResultSet接口的方法可分為三類:
-
導航方法:用於移動光標.
-
獲取方法:用於查看當前行的光標所指向的列中的數據。
-
更新方法:用於更新當前行的列中的數據。這些更新然後可以在基礎數據庫中,以及更新。
將光標移動基於ResultSet的屬性。所創建生成ResultSet相應的聲明時,這些屬性被指定。
JDBC提供下列連接方法來創建所需的ResultSet語句:
-
createStatement(int RSType, int RSConcurrency);
-
prepareStatement(String SQL, int RSType, int RSConcurrency);
-
prepareCall(String sql, int RSType, int RSConcurrency);
第一個參數表示ResultSet對象的類型,第二個參數是2的ResultSet常量,用於指定一個結果集是否為隻讀或可更新之一。
ResultSet的類型:
可能的RSType如下,如果不指定ResultSet類型,將自動獲得一個是TYPE_FORWARD_ONLY。
Type | 描述 |
---|---|
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接口涉及移動光標,包括:
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 將光標移動到指定的行 |
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方法有兩個版本:
-
即需要在一個列名。
-
即需要在列中索引。
例如,如果有興趣查看的列包含一個整數,需要使用ResultSet調用getInt()方法之一:
S.N. | 方法 & 描述 |
---|---|
1 |
public int getInt(String columnName) throws SQLException 返回整數的當前行中名為ColumnName列 |
2 |
public int getInt(int columnIndex) throws SQLException 返回整數的當前行中指定列的索引。列索引從1開始,意味著一個行的第一列是1,行的第二列是2,依此類推。 |
與此類似的還有get方法在ResultSet接口為每個八個Java原始類型,以及常見的類型比如java.lang.String,java.lang.Object和java.net.URL
也有用於獲取SQL數據類型java.sql.Date,java.sql.Time,java.sql.Timestamp,java.sql.Clob,java.sql.Blob中的方法。檢查有關使用這些SQL數據類型的詳細信息的文檔。
為了更好地理解,建議學習 查看 - 示例代碼.
更新的結果集:
ResultSet接口中包含的更新方法用於更新的結果集的數據的集合。
由於get方法,有兩種更新方法為每種數據類型:
-
即需要在一個列名。
-
即需要在列中索引。
例如,要更新一個結果集的當前行的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 類似於前麵的方法,不同之處在於由它的名稱,而不是它的索引指定的列。 |
有更新方法八個原始數據類型,以及字符串,對象,URL,並在java.sql包中的SQL數據類型。
更新結果集中的行改變當前行的列中的ResultSet對象,而不是基礎數據庫中。要更新更改數據庫中的一行,需要調用下麵的方法之一。
S.N. | 方法 & 描述 |
---|---|
1 |
public void updateRow() 通過更新數據庫中相應的行更新當前行。 |
2 |
public void deleteRow() 從數據庫中刪除當前行 |
3 |
public void refreshRow() 刷新在結果集的數據,以反映最新變化在數據庫中。 |
4 |
public void cancelRowUpdates() 取消所做的當前行的任何更新。 |
5 |
public void insertRow() 插入一行到數據庫中。當光標指向插入行此方法隻能被調用。 |
為了更好地理解,建議學習更新示例代碼。