【Java學習】JDBC結果集

JDBC結果集

概述

首先結果集是ResultSet它是一個接口。html

所謂的結果集ResultSet,它表明的就是數據表(a table of data)。它一般經過執行一個Statement對象的查詢數據庫來獲得的。java

一個ResultSet對象維持着指向當前數據行的一個光標,光標出事指向的第一行以前,使用next方法講光標移動到下一行,檔結果集對象中沒有更多的行,就返回false。固然可使用while循環來遍歷整個結果集。sql

建立指定類型的ResultSet對象

默認的ResultSet對象是不可更新的而且有一個僅僅能夠向前移動的光標。這說明,你僅僅能遍歷一次結果集--從第一行到最後一行。固然,可使ResultSet變得能夠滾動和或可更新。看下面的代碼:數據庫

Statement stmt = con.createStatement(Result.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a,b FROM TABLE2");
//rs是可滾動的、不會被其餘人改變、可更新。

咱們來更加詳細的說明一下:咱們已經知道ResultSet是一個藉口,咱們之前都是經過Statement執行查詢方法,來返回一個ResultSet對象。其中咱們只能經過設置Statement對象,來設置返回的ResultSet對象。其中的貓膩就是在建立Statement對象的方法中。其中Connection提供一下方法來建立所需的ResultSet:
第一種:api

createStatement(int RSType, int RSConcurrency);

第二種:併發

prepareStatement(String SQL, int RSType, int RSConcurrency);

第三種:oracle

prepareCall(String sql, int RSType, int RSConcurrency);

這樣來看都有有哪些RSType呢,有哪些RSConcurrency呢?yii

ResultSet類型

可能的RSType值以下。不指定的話默認分配TYPE_FORWARD_ONLY
如下詳細解釋各個類型:code

ResultSet.TYPE_FORWARD_ONLY 光標只能在結果集中向前移動。
ResultSet.TYPE_SCROLL_INSENSITIVE 光標能夠向前和向後滾動,結果集對建立結果集後發生的數據庫所作的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE 光標能夠向前和向後滾動,結果集對建立結果集以後發生的其餘數據庫的更改敏感。htm

ResultSet併發性

可能的RSConcurrency以下,不指定任何併發類型,將自動份分配CONCUR_READ_ONLY

ResultSet.CONCUR_READ_ONLY 建立只讀結果集,這是默認值。
ResultSet.CONCUR_UPDATABLE 建立可更新的結果集

移動光標的方法

進行數據操做,或者列數據更新,都須要移動光標。
下面的一些方法詳細說明:

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接口提供了更多的getter方法,如:getInt() getLong() getBoolean(),經過這些方法,就能夠從當前行中獲取列數據。列數據能夠經過使用索引值,也能夠經過使用列的名字。一般使用索引值會更加高效,注意是從1開始的。
爲了最大程度的簡便,ResultSet每一行的列數據應該從左往右讀,而且只能讀一次。

經過列名字,來獲取列數據的getter方法,它的大小寫是不敏感的。當使用getter方法有列名相同的狀況時,將返回第一個匹配的列數據。使用列名是不明確的,因此最好仍是用索引值。

除了getter方法,在JDBC2.0API中,又添加了updater方法。getter裏面的參數一樣適用於updater

更新結果集

與getter方法同樣,能夠經過類名稱來更新 也能夠經過列索引

updater方法能夠經過如下兩種方法使用:

第一種update方法

在當前行更新列數據。在一個可滾動的ResultSet 對象,光標能夠像前移動也能夠向後移動到一個特定的位置。如下代碼演示了,更新第五行的NAME列數據:

rs.absolute(5);//將光標移動到第5行
rs.updateString("Name","AINSWORTH");//更新數據
rs.updateRow();//更新到元數據(源表)

第二種方法

向插入行中插入列數據,怎麼理解呢?一個可更新的ResultSet對象有一個特殊的行,這個行可以做爲工做行區域,用來建立被插入的行。如下代碼體現了向插入行中插入列數據。

rs.moveToInsertRow();//將光標移動到插入行。
rs.upsateString(1,"AINSWORTH");//將第一列,更新數據
rs.updateInt(2,35);//將第2列,更新數據
rs.updateBoolean(3,true);//第三列
rs.insertRow();//將這三列數據插入到rs中,而且更新到元數據中。
rs.moveToCurrentRow();

當Statement對象關閉後,結果集可以自動的關閉。
同時ResultSet對象中的列索引,類型和參數,能夠經過Resultset.getMetaData()方法返回。

參考資料

Interface ResultSet
易百教程ps:我愈來愈以爲官方文檔的好處了,寫的很清楚明白。之後就專一官方文檔了。

相關文章
相關標籤/搜索