1. 程式人生 > >Java ResultSet介面 詳細說明

Java ResultSet介面 詳細說明

Java ResultSet介面 詳細說明

記錄集介面(ResultSet)介面

  在JDBC API 2.0中,ResultSet介面有了很大的變化,增加了很多行操作、行定位的新方法,功能也強

大了許多,最主要的變化有以下幾個方面:

  1、新定義了若干個常數
  這些常數用於指定ResultSet的型別,遊標移動的方向等性質,如下所示:
  public static final int FETCH_FORWARD;
  public static final int FETCH_REVERSE;
  public static final int FETCH_UNKNOWN;
  public static final int TYPE_FORWARD_ONLY;
  public static final int TYPE_SCROLL_INSENSITIVE;
  public static final int TYPE_SCROLL_SENSITIVE;
  public static final int CONCUR_READ_ONLY;
  public static final int CONCUR_UPDATABLE;
  FETCH_FORWARD:該常數的作用是指定處理記錄集中行的順序是由前到後,即從第一行開始處理,一直

到最後一行。
  FETCH_REVERSE:該常數的作用是指定處理記錄集中行的順序是由後到前,即從最後一行開始處理。一

直到第一行。
  FETCH_UNKNOWN:該常數的作用是不指定處理記錄集中行的順序,由JDBC驅動程式和資料庫系統決定。
  TYPE_FORWARD_ONLY:該常數的作用是指定資料庫遊標的移動方向是向前,不允許向後移動,即只能使

用ResultSet介面的next()方法,而不能使用previous()方法,否則會產生錯誤。
  TYPE_SCROLL_INSENSITIVE:該常數的作用是指定資料庫遊標可以在記錄集中前後移動,並且當前資料

庫使用者獲取的記錄集對其他使用者的操作不敏感,就是說,當前使用者正在瀏覽記錄集中的資料,與此同時,

其他使用者更新了資料庫中的資料,但是當前使用者所獲取的記錄集中的資料不會受到任何影響。
  TYPE_SCROLL_SENSITIVE:該常數的作用是指定資料庫遊標可以在記錄集中前後移動,並且當資料庫用

戶獲取的記錄集對其他使用者的操作敏感,就是說,當前使用者正在瀏覽記錄集中,但是其他使用者的操作使數

據庫中的資料發生了變化,當前使用者所獲取的記錄集中的資料也會同步發生變化,這樣有可能會導致非常

嚴重的錯誤發生,建議慎重使用該常數。
  CONCUR_READ_ONLY:該常數的作用是指定當前記錄集的協作方式(concurrency mode)為只讀,一旦使

用了這個常數,那麼使用者僦不可以更新記錄集中的資料。
  CONCUR_UPDATABLE:該常數的作用是指定當前記錄集的協作方式(concurrency mode)為可能更新,一

旦使用了這個常數,那麼使用者就可以使用updateXXX()等方法更新記錄集中的資料。
  在JSP/Servlet程式中如何使用這些預定義的常數呢?這是讀者很關心的問題,在9.2.2節中將有介紹

  2、ResultSet介面提供了一整套的定位方法
  這些可以在記錄集中定位的任意一行,具體有:
  public boolean absolute(int row);該方法的作用是將記錄集中的某一行設定為當前行,亦即將數

據庫遊標移動到指定的行,引數row指定了目標行的行號,這是絕對的行號,由記錄集的第一行開始計算,

不是相對的行號。
  public boolean relative(int rows);該方法的作用也是將記錄集中的某一行設定為當前行,但是它

的引數rows表示目標行相對於當前行的行號,例如當前行是第3行,現在需要移動麼第6行去,既可以使用

absolute()方法,也可以使用frelative()方法,程式碼如下。
  例:
  rs.absolute(5);
  或者
  rs.relative(2);
  其中rs代表ResultSet介面的例項物件。
  又如當前行是第5行,需要移動到第3行去,程式碼如下。
  例:
  rs.absolute(3);
  或者
  rs.relative(-2);
  其中rs代表ResultSet介面的例項物件。
  讀者需要注意的問題是,傳遞給relative()方法的引數,如果是正數,那麼資料庫遊標向前移動,如

果是負數,那麼資料庫的遊標向後移動。
  注意:在本間中所說的資料庫遊標向前移動是指向行號增大的方向移動,向後移動是指向行號減少的

方法移動。
  public boolean first();該方法的作用是將當前行定位到資料庫記錄集的第一行。
  public boolean last();該方法的作用剛好和first()方法相反,是將當前行定位到資料庫記錄集的最

後一行。
  public boolean isFirst();該方法的作用是檢查當前行是否記錄集的第一行,如果是,返回true,否

則,返回false。
  public boolean isLast();該方法的作用是檢查當前行是否記錄集的最後一行,如果是,返回true,

否則,返回false。
  public void afterLast();該方法的作用是將資料庫遊標移到記錄集的最後,位於記錄集最後一行的

後面,如果該記錄集不包含任何的行,該方法不產生作用。
  public void beforeFirst();該方法的作用是將資料庫的遊標移動記錄集的最前面,位於記錄集第一

行的前面,如果記錄集不包含任何的行。該方法不產生作用。
  public boolean isAfterLast();該方法檢查資料庫遊標是否處於記錄集的最後面(即是否處於最後一

行記錄的後面),如果是,返回true,否則,返回false。
  public boolean isBeforeFirst();該方法檢查資料庫遊標是否處於記錄集的最前面(即是否處於最前

面一行記錄的前面),如果是,返回true,否則,返回false。
  public boolean next();該方法的作用是將資料庫遊標向前移動一位,使得下一行成為當前行,當剛

剛開啟記錄集物件時,資料庫遊標的位置在記錄集的最前面,第一次使用next()方法,將會使資料庫遊標

定位到記錄集的第一行,第二次使用next()方法,將會使資料庫遊標定位到記錄集的第二行,以此類推。
  注意:如果在當前行打開了一個輸入流(Input Stream),那麼再次使用next()方法時,將會自動關閉

該輸入流。
  public boolean previous();該方法的作用是將資料庫遊標向後移動一位,使得上一行成為當前行。

  3、ResultSet介面添加了對行操作的支援
  使用JDBC API2.0不僅可以任意將資料庫遊標定位到記錄集中的特定行,而且可以使用ResultSet介面

新定義的一套方法更新當前行的資料,在以前,如果Java程式設計師希望更新記錄集中某行的資料,必須傳送

SQL語句給資料庫,程式設計師需要在Java程式碼中嵌入冗長的SQL語句,用以執行UPDATE、DELETE、INSERT等數

據庫操作,但是,當JDBC API2.0出現時,一切就都改變了,程式設計師已經可以部分拋開SQL語言,享受Java

程式設計的樂趣了。ResultSet介面中新新增的部分方法如下所示:
  public boolean rowDeleted();如果當前記錄集的某行被刪除了,那麼記錄集中將會留出一個空位,

呼叫rowDelete()方法,如果探測到空位的存在,那麼就返回true,如果沒有要測到空位的存在,就返回

false值。
  public boolean rowInserted(); 如果當前記錄集中插入了一個新行,該方法將返回true,否則返回

false。
  public boolean rowUpdated();如果當前記錄集的當前行的資料被更新,該方法返回true,否則返回

false。
  public void insertRow();該方法將執行插入一個新行到當前記錄集的操作;
  public void updateRow();該方法將更新當前記錄集當前行的資料。
  public void deleteRow();該方法將刪除當前記錄集的當前行。
  public void updateString(int columnIndex,String x);該方法更新當前記錄集當前行某列的值,該

列的資料型別是String(指Java資料型別是String,與之對應的JDBC資料型別是VARCHAR或NVARCHAR等資料

型別),該方法的引數columnIndex指定所要更新的列的列索引,第一列的列索引是1,以此類推,第二個

引數x代表新的值。這個方法並不執行資料庫操作,需要insertRow()方法或者updateRow()方法以後,記錄

集和資料庫中的資料才能夠真正更新。
  public void updateString(String columnName, String x);該方法和上面介紹的同名方法差不多,

不過該方法的第一個引數是columnName,代表需要更新的列的列名,而不是columnIndex。
  ResultSet介面中還定義了很多個updateXXX()方法,都和上面的兩個方法相類似,由於篇幅的原因,

在這裡就不詳細描述了,對此感興趣的讀者,可以參考相關的文獻。
  往資料庫當前記錄集插入新行的操作流程如下:
  (1)呼叫moveToInsertRow()方法。
  (2)呼叫updateXXX()方法,指定插入行各列的值。
  (3)呼叫insertRow()方法,往資料庫中插入新的行。

  4、新的ResultSet介面添加了對SQL3資料庫型別的支援
  SQL3技術規範中添加了若干個新的資料型別,如REF、ARRAY等,ResultSet介面擴充了getXXX()方法,

添加了獲取這些型別的資料的getXXX()方法,如getArray()、getBlob()、getBigDecimal()、getClob()、

getRef()方法,這些方法既可以接收列索引為引數,也可以接收列名(欄位名)為引數,這些方法分別返回

對應的Java物件例項,如Clob、Array(JDBC Array)、Blob、BigDecimal、Ref等,使用起來十分方便,至

於這些方法的用法,在下面還會涉及,這裡就不贅述了。

  5、獲取記錄集行數的方法
  (1)首先使用last()方法,將資料庫遊標定位到記錄集的最後一行。
  (2)使用getRow()方法,返回記錄集最後一行的行索引。該索引就等於記錄集所包含記錄的個數,也就
是記錄集的行數。getRow()方法是在JDBC API 2.0中才定義的,在JDBC API 1.0中沒有這個方法。