首先結果集是ResultSet
它是一個接口。html
所謂的結果集ResultSet
,它表明的就是數據表(a table of data)。它一般經過執行一個Statement
對象的查詢數據庫來獲得的。java
一個ResultSet
對象維持着指向當前數據行的一個光標,光標出事指向的第一行以前,使用next方法講光標移動到下一行,檔結果集對象中沒有更多的行,就返回false。固然可使用while循環來遍歷整個結果集。sql
默認的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
可能的RSType值以下。不指定的話默認分配TYPE_FORWARD_ONLY
如下詳細解釋各個類型:code
ResultSet.TYPE_FORWARD_ONLY
光標只能在結果集中向前移動。ResultSet.TYPE_SCROLL_INSENSITIVE
光標能夠向前和向後滾動,結果集對建立結果集後發生的數據庫所作的更改不敏感。ResultSet.TYPE_SCROLL_SENSITIVE
光標能夠向前和向後滾動,結果集對建立結果集以後發生的其餘數據庫的更改敏感。htm
可能的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
方法能夠經過如下兩種方法使用:
在當前行更新列數據。在一個可滾動的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:我愈來愈以爲官方文檔的好處了,寫的很清楚明白。之後就專一官方文檔了。