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
,依此類推。
類似地,在八個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()
在數據庫中插入一行。 只有當光標指向插入行時,才能調用此方法。
爲了更好的理解,建議您學習研究「更新結果集示例代碼」