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
常數之一,用於指定結果集是唯讀還是可更新。
可能的RSType
值如下。如果不指定任何ResultSet
型別,將自動分配一個TYPE_FORWARD_ONLY
值。
型別 | 描述 |
---|---|
ResultSet.TYPE_FORWARD_ONLY |
游標只能在結果集中向前移動。 |
ResultSet.TYPE_SCROLL_INSENSITIVE |
游標可以向前和向後捲動,結果集對建立結果集後發生的資料庫所做的更改不敏感。 |
ResultSet.TYPE_SCROLL_SENSITIVE |
游標可以向前和向後捲動,結果集對建立結果集之後發生的其他資料庫的更改敏感。 |
可能的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 ,依此類推。 |
類似地,在八個Java基元型別中的每一個的ResultSet
介面中都有get
方法,以及常見的型別,如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()
方法之一:
序號 | 方法 | 描述 |
---|---|---|
1 | public void updateString(int columnIndex, String s) throws SQLException |
將指定列中的String 值更改為指定的s 值。 |
2 | public void updateString(String columnName, String s) throws SQLException |
與前前的方法類似,除了使用列的名稱而不是列的索引指定。 |
有八種基本資料型別的更新方法,以及java.sql
包中的String
,Object
,URL
和SQL資料型別。
更新結果集中的一行會更改ResultSet
物件中當前行的列,但不會更改底層資料庫中的列的值。 要更新資料庫中的行,需要呼叫以下方法之一。
序號 | 方法 | 描述 |
---|---|---|
1 | public void updateRow() |
更新資料庫中當前行 |
2 | public void deleteRow() |
從資料庫中刪除當前行 |
3 | public void refreshRow() |
重新整理結果集中的資料以反映資料庫中最近的任何更改。 |
4 | public void cancelRowUpdates() |
取消對當前行所做的任何更新。 |
5 | public void insertRow() |
在資料庫中插入一行。 只有當游標指向插入行時,才能呼叫此方法。 |
為了更好的理解,建議您學習研究「更新結果集範例程式碼」