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中没有这个方法。

猜你喜欢

转载自blog.csdn.net/qq_36838191/article/details/85058881