從數(shù)據(jù)庫(kù)查詢中讀取數(shù)據(jù)的 SQL 語(yǔ)句返回結(jié)果集中的數(shù)據(jù)。SELECT 語(yǔ)句是從數(shù)據(jù)庫(kù)中選擇行并在結(jié)果集中查看它們的標(biāo)準(zhǔn)方法。Sql.ResultSet 接口表示數(shù)據(jù)庫(kù)查詢的結(jié)果集。
ResultSet 對(duì)象維護(hù)一個(gè)指向結(jié)果集中當(dāng)前行的游標(biāo)。術(shù)語(yǔ)“結(jié)果集(result set)”指的是 ResultSet 對(duì)象中包含的行和列數(shù)據(jù)。
ResultSet接口的方法可以分為三類-
導(dǎo)航方法: 用于左右移動(dòng)光標(biāo)。
Get方法: 用于查看光標(biāo)所指向的當(dāng)前行的列中的數(shù)據(jù)。
Update方法:用于更新當(dāng)前行各列中的數(shù)據(jù)。然后,更新也可以在基礎(chǔ)數(shù)據(jù)庫(kù)中更新。
光標(biāo)可根據(jù)ResultSet的屬性移動(dòng)。這些屬性是在創(chuàng)建相應(yīng)的生成ResultSet的Statement時(shí)指定的。
JDBC提供以下連接方法來(lái)創(chuàng)建具有所需ResultSet的語(yǔ)句-
createStatement(int RSType, int RSConcurrency);
prepareStatement(String SQL, int RSType, int RSConcurrency);
prepareCall(String sql, int RSType, int RSConcurrency);
第一個(gè)參數(shù)表示 ResultSet 對(duì)象的類型,第二個(gè)參數(shù)是兩個(gè) ResultSet 常量之一,用于指定結(jié)果集是只讀的還是可更新的。
可能的RSType如下所示。如果您不指定任何ResultSet類型,您將自動(dòng)獲得TYPE_FORWARD_ONLY類型的結(jié)果集。
類型 | 描述 |
---|---|
ResultSet.TYPE_FORWARD_ONLY | 光標(biāo)只能在結(jié)果集中向前移動(dòng)。 |
ResultSet.TYPE_SCROLL_INSENSITIVE | 游標(biāo)可以向前和向后滾動(dòng),并且結(jié)果集對(duì)其他人在創(chuàng)建結(jié)果集之后對(duì)數(shù)據(jù)庫(kù)所做的更改不敏感。 |
ResultSet.TYPE_SCROLL_SENSITIVE. | 游標(biāo)可以向前和向后滾動(dòng),并且結(jié)果集對(duì)其他人在創(chuàng)建結(jié)果集之后對(duì)數(shù)據(jù)庫(kù)所做的更改非常敏感。 |
可能的RSConcurrency在下面給出。如果您未指定任何并發(fā)類型,則將自動(dòng)獲得 CONCUR_READ_ONLY 類型。
并發(fā) | 描述 |
---|---|
ResultSet.CONCUR_READ_ONLY | 創(chuàng)建只讀結(jié)果集。這是默認(rèn)值 |
ResultSet.CONCUR_UPDATABLE | 創(chuàng)建可更新的結(jié)果集。 |
到目前為止,我們編寫的所有示例都可以編寫如下,該示例初始化一個(gè)Statement對(duì)象以創(chuàng)建只讀的ResultSet對(duì)象-
try { Statement stmt = conn.createStatement( ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); } catch(Exception ex) { .... } finally { .... }
ResultSet接口中有幾種涉及移動(dòng)光標(biāo)的方法,包括-
序號(hào) | 方法與說(shuō)明 |
---|---|
1 | public void beforeFirst() throws SQLException 將光標(biāo)移到第一行之前。 |
2 | public void afterLast() throws SQLException 將光標(biāo)移到最后一行之后。 |
3 | public boolean first() throws SQLException 將光標(biāo)移到第一行。 |
4 | public void last() throws SQLException 將光標(biāo)移到最后一行。 |
5 | public boolean absolute(int row) throws SQLException 將光標(biāo)移動(dòng)到指定行。 |
6 | public boolean relative(int row) throws SQLException 將光標(biāo)向前或向后移動(dòng)給定的行數(shù),從它當(dāng)前所指向的位置移動(dòng)。 |
7 | public boolean previous() throws SQLException 將光標(biāo)移動(dòng)到前一行。如果前一行不在結(jié)果集中,則此方法返回false。 |
8 | public boolean next() throws SQLException 將光標(biāo)移動(dòng)到下一行。如果結(jié)果集中沒(méi)有更多的行,則此方法返回 false。 |
9 | public int getRow() throws SQLException 返回光標(biāo)所指向的行號(hào)。 |
10 | public void moveToInsertRow() throws SQLException 將光標(biāo)移動(dòng)到結(jié)果集中的特殊行,該行可用于將新行插入到數(shù)據(jù)庫(kù)中。記住當(dāng)前光標(biāo)的位置。 |
11 | public void moveToCurrentRow() throws SQLException 如果光標(biāo)當(dāng)前位于插入行,則將光標(biāo)移回當(dāng)前行; 否則,此方法不執(zhí)行任何操作 |
為了更好地理解,讓我們研究“導(dǎo)航-示例代碼”。
ResultSet接口包含許多用于獲取當(dāng)前行數(shù)據(jù)的方法。
每個(gè)可能的數(shù)據(jù)類型都有一個(gè)get方法,每個(gè)get方法都有兩個(gè)版本-
帶有列名的列。
帶有列索引的索引。
例如,如果您感興趣的查看列包含一個(gè) int,那么您需要使用 ResultSet 的 getInt ()方法之一
序號(hào) | 方法與說(shuō)明 |
---|---|
1 | public int getInt(String columnName) throws SQLException 返回名為columnName的列中當(dāng)前行的 int。 |
2 | public int getInt(int columnIndex) throws SQLException 返回指定列索引中當(dāng)前行中的整型數(shù)。列索引從1開(kāi)始,這意味著行的第一列是1,行的第二列是2,依此類推。 |
同樣,在ResultSet接口中,對(duì)于八種Java基本類型中的每一種,以及常見(jiàn)類型(如java.lang.String,java.lang.Object和java.net.URL),都有g(shù)et方法。
還有一些獲取SQL數(shù)據(jù)類型java.sql.Date,java.sql.Time,java.sql.TimeStamp,java.sql.Clob和java.sql.Blob的方法。查看文檔以獲取有關(guān)使用這些SQL數(shù)據(jù)類型的更多信息。
為了更好地理解,讓我們研究查看-Example Code。
ResultSet接口包含用于更新結(jié)果集數(shù)據(jù)的更新方法的集合。
與get方法一樣,每種數(shù)據(jù)類型都有兩種更新方法-
帶有列名的列。
帶有列索引的索引。
例如,要更新結(jié)果集當(dāng)前行的String列,可以使用以下updateString()方法之一-
序號(hào) | 方法與說(shuō)明 |
---|---|
1 | public void updateString(int columnIndex, String s) throws SQLException 將指定列中的 String 更改為 s 的值。 |
2 | public void updateString(String columnName, String s) throws SQLException 與前面的方法類似,只是列是通過(guò)其名稱而不是索引指定的。 |
java.sql包中有八種原始數(shù)據(jù)類型以及String,Object,URL和SQL數(shù)據(jù)類型的更新方法。
更新結(jié)果集中的一行會(huì)更改ResultSet對(duì)象中當(dāng)前行的列,但不會(huì)更改基礎(chǔ)數(shù)據(jù)庫(kù)中的行。要更新對(duì)數(shù)據(jù)庫(kù)中行的更改,您需要調(diào)用以下方法之一。
序號(hào) | 方法與說(shuō)明 |
---|---|
1 | public void updateRow() 通過(guò)更新數(shù)據(jù)庫(kù)中相應(yīng)的行來(lái)更新當(dāng)前行。 |
2 | public void deleteRow() 從數(shù)據(jù)庫(kù)中刪除當(dāng)前行 |
3 | public void refreshRow() 刷新結(jié)果集中的數(shù)據(jù),以反映數(shù)據(jù)庫(kù)中最近的任何更改。 |
4 | public void cancelRowUpdates() 取消對(duì)當(dāng)前行所做的任何更新。 |
5 | public void insertRow() 在數(shù)據(jù)庫(kù)中插入一行。只有當(dāng)光標(biāo)指向插入行時(shí),才能調(diào)用此方法。 |
為了更好地理解,讓我們研究“更新示例代碼”。