位置:首頁 > Java技術 > JDBC教學 > JDBC結果集Result/Sets

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()
插入一行到數據庫中。當光標指向插入行此方法隻能被調用。

為了更好地理解,建議學習更新示例代碼。