SQL 語句從數(shù)據(jù)庫查詢中獲取數(shù)據(jù),并將數(shù)據(jù)返回到結(jié)果集中。SELECT 語句是一種標(biāo)準(zhǔn)的方法,它從一個(gè)數(shù)據(jù)庫中選擇行記錄,并顯示在一個(gè)結(jié)果集中。 java.sql.ResultSet 接口表示一個(gè)數(shù)據(jù)庫查詢的結(jié)果集。
一個(gè) ResultSet 對(duì)象控制一個(gè)光標(biāo)指向當(dāng)前行的結(jié)果集。術(shù)語“結(jié)果集”是指包含在 ResultSet 對(duì)象中的行和列的數(shù)據(jù)。
ResultSet 接口的方法可細(xì)分為三類-
光標(biāo)的移動(dòng)基于 ResultSet 的屬性。用相應(yīng)的語句生成 ResultSet 對(duì)象時(shí),同時(shí)生成 ResultSet 的屬性。
JDBC 提供了連接方法通過下列創(chuàng)建語句來生成你所需的 ResultSet 對(duì)象:
第一個(gè)參數(shù)表示 ResultSet 對(duì)象的類型,第二個(gè)參數(shù)是兩個(gè) ResultSet 常量之一,該常量用于判斷該結(jié)果集是只讀的還是可修改的。
可能的 RSType 如下所示。如果你不指定 ResultSet 類型,將自動(dòng)獲得的值是 TYPE_FORWARD_ONLY。
類型 | 描述 |
---|---|
ResultSet.TYPE_FORWARD_ONLY | 光標(biāo)只能在結(jié)果集中向前移動(dòng)。 |
ResultSet.TYPE_SCROLL_INSENSITIVE | 光標(biāo)可以向前和向后移動(dòng)。當(dāng)結(jié)果集創(chuàng)建后,其他人對(duì)數(shù)據(jù)庫的操作不會(huì)影響結(jié)果集的數(shù)據(jù)。 |
ResultSet.TYPE_SCROLL_SENSITIVE. | 光標(biāo)可以向前和向后移動(dòng)。當(dāng)結(jié)果集創(chuàng)建后,其他人對(duì)數(shù)據(jù)庫的操作會(huì)影響結(jié)果集的數(shù)據(jù)。 |
RSConcurrency 的值如下所示,如果你不指定并發(fā)類型,將自動(dòng)獲得的值是 CONCUR_READ_ONLY。
并發(fā)性 | 描述 |
---|---|
ResultSet.CONCUR_READ_ONLY | 創(chuàng)建一個(gè)只讀結(jié)果集,這是默認(rèn)的值。 |
ResultSet.CONCUR_UPDATABLE | 創(chuàng)建一個(gè)可修改的結(jié)果集。 |
到目前為止我們的示例可以如下所示,可以寫成初始化一個(gè) Statement 對(duì)象來創(chuàng)建一個(gè)只能前進(jìn),而且只讀的 ResultSet 對(duì)象-
try {
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
....
}
finally {
....
}
在 ResultSet 接口中包括如下幾種方法涉及移動(dòng)光標(biāo)-
S.N. | 方法 & 描述 |
---|---|
1 |
public void beforeFirst() throws SQLException
將光標(biāo)移動(dòng)到第一行之前。 |
2 |
public void afterLast() throws SQLException
將光標(biāo)移動(dòng)到最后一行之后。 |
3 |
public boolean first() throws SQLException
將光標(biāo)移動(dòng)到第一行。 |
4 |
public void last() throws SQLException
將光標(biāo)移動(dòng)到最后一行。 |
5 |
public boolean absolute(int row) throws SQLException
將光標(biāo)移動(dòng)到指定的第 row 行。 |
6 |
public boolean relative(int row) throws SQLException
將光標(biāo)移動(dòng)到當(dāng)前指向的位置往前或往后第 row 行的位置。 |
7 |
public boolean previous() throws SQLException
將光標(biāo)移動(dòng)到上一行,如果超過結(jié)果集的范圍則返回 false。 |
8 |
public boolean next() throws SQLException
將光標(biāo)移動(dòng)到下一行,如果是結(jié)果集的最后一行則返回 false。 |
9 |
public int getRow() throws SQLException
返回當(dāng)前光標(biāo)指向的行數(shù)的值。 |
10 |
public void moveToInsertRow() throws SQLException
將光標(biāo)移動(dòng)到結(jié)果集中指定的行,可以在數(shù)據(jù)庫中插入新的一行。當(dāng)前光標(biāo)位置將被記住。 |
11 |
public void moveToCurrentRow() throws SQLException
如果光標(biāo)處于插入行,則將光標(biāo)返回到當(dāng)前行,其他情況下,這個(gè)方法不執(zhí)行任何操作。 |
為了更好地理解,讓我們研究學(xué)習(xí)導(dǎo)航示例代碼。
ResultSet接口中含有幾十種從當(dāng)前行獲取數(shù)據(jù)的方法。
每個(gè)可能的數(shù)據(jù)類型都有一個(gè) get 方法,并且每個(gè) get 方法有兩個(gè)版本-
例如,如果你想查看的列包含一個(gè) int 類型,你需要在 ResultSet 中調(diào)用 getInt()方法-
S.N. | 方法 & 描述 |
---|---|
1 |
public int getInt(String columnName) throws SQLException
返回當(dāng)前行中名為 columnName 的列的 int 值。 |
2 |
public int getInt(int columnIndex) throws SQLException
返回當(dāng)前行中指定列的索引的 int 值。列索引從 1 開始,意味著行中的第一列是 1 ,第二列是 2 ,以此類推。 |
同樣的,在 ResultSet 接口中還有獲取八個(gè) Java 原始類型的 get 方法,以及常見的類型,比如 java.lang.String,java.lang.Object 和 java.net.URL。
也有用于獲取 SQL 數(shù)據(jù)類型 java.sql.Date, java.sql.Time, java.sql.Timestamp, java.sql.Clob,java.sql.Blob 中的方法。查看文檔可以了解使用這些 SQL 數(shù)據(jù)類型的更多的信息。
ResultSet 接口包含了一系列的更新方法,該方法用于更新結(jié)果集中的數(shù)據(jù)。
用 get 方法可以有兩個(gè)更新方法來更新任一數(shù)據(jù)類型-
例如,要更新一個(gè)結(jié)果集的當(dāng)前行的 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
類似于前面的方法,不同之處在于指定的列是用名字來指定的,而不是它的索引。 |
八個(gè)原始數(shù)據(jù)類型都有其更新方法,比如 String,Object,URL,和在 java.sql 包中的 SQL 數(shù)據(jù)類型。
更新結(jié)果集中的行將改變當(dāng)前行的列中的 ResultSet 對(duì)象,而不是基礎(chǔ)數(shù)據(jù)庫中的數(shù)據(jù)。要更新數(shù)據(jù)庫中一行的數(shù)據(jù),你需要調(diào)用以下的任一方法-
S.N. | 方法 & 描述 |
---|---|
1 |
public void updateRow()
通過更新數(shù)據(jù)庫中相對(duì)應(yīng)的行來更新當(dāng)前行。 |
2 |
public void deleteRow()
從數(shù)據(jù)庫中刪除當(dāng)前行。 |
3 |
public void refreshRow()
在結(jié)果集中刷新數(shù)據(jù),以反映數(shù)據(jù)庫中最新的數(shù)據(jù)變化。 |
4 |
public void cancelRowUpdates()
取消對(duì)當(dāng)前行的任何修改。 |
5 |
public void insertRow()
在數(shù)據(jù)庫中插入一行。本方法只有在光標(biāo)指向插入行的時(shí)候才能被調(diào)用。 |