SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 SELECT语句用于从数据库中选择行并在结果集中查看它们的标准方法。 java.sql.ResultSet接口表示数据库查询的结果集。

ResultSet对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在ResultSet对象中的行和列数据。

ResultSet接口的方法可以分为三类:

  • 浏览方法:用于移动光标。
  • 获取方法:用于查看光标指向的当前行的列中的数据。
  • 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数据。

光标可以基于ResultSet的属性移动。当创建生成ResultSet的相应Statement时,将指定这些属性。

JDBC提供以下连接方法来创建具有所需ResultSet的语句 -

  • createStatement(int RSType, int RSConcurrency);
  • prepareStatement(String SQL, int RSType, int RSConcurrency);
  • prepareCall(String sql, int RSType, int RSConcurrency);

第一个参数表示ResultSet对象的类型,第二个参数是两个ResultSet常量之一,用于指定结果集是只读还是可更新。

ResultSet类型

可能的RSType值如下。如果不指定任何ResultSet类型,将自动分配一个TYPE_FORWARD_ONLY值。

ResultSet.TYPE_FORWARD_ONLY光标只能在结果集中向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE光标可以向前和向后滚动,结果集对创建结果集后发生的数据库所做的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库的更改敏感。

ResultSet的并发性

可能的RSConcurrency如下。 如果不指定任何并发类型,将自动获得一个CONCUR_READ_ONLY值。

ResultSet.CONCUR_READ_ONLY创建只读结果集,这是默认值。
ResultSet.CONCUR_UPDATABLE创建可更新的结果集

到目前为止我们写的所有例子可以写成如下,它初始化一个Statement对象来创建一个只向前的只读ResultSet对象 -

try {
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
....
}
finally {
....
}
Java

浏览结果集

ResultSet接口中有几种涉及移动光标的方法,包括 -

1public void beforeFirst() throws SQLException将光标移动到第一行之前
2public void afterLast() throws SQLException将光标移动到最后一行之后。
3public boolean first() throws SQLException将光标移动到第一行。
4public void last() throws SQLException将光标移动到最后一行。
5public boolean absolute(int row) throws SQLException将光标移动到指定的行。
6public boolean relative(int row) throws SQLException从当前指向的位置,将光标向前或向后移动给定行数。
7public boolean previous() throws SQLException将光标移动到上一行。 如果上一行关闭结果集,此方法返回false
8public boolean next() throws SQLException将光标移动到下一行。 如果结果集中没有更多行,则此方法返回false
9public int getRow() throws SQLException返回光标指向的行号。
10public void moveToInsertRow() throws SQLException将光标移动到结果集中的特殊行,该行可用于将新行插入数据库。当前光标位置被记住。
11public void moveToCurrentRow() throws SQLException如果光标当前位于插入行,则将光标移回当前行; 否则,此方法什么也不做

为了更好的理解,建议学习浏览记录示例代码。

查看结果集

ResultSet接口包含数十种获取当前行数据的方法。

每个可能的数据类型都有一个get方法,每个get方法有两个版本 -

  • 一个是采用列名称。
  • 另一个采用列索引。

例如,如果对查看感兴趣的列包含一个int,则需要使用ResultSet的其中一个getInt()方法 -

1public int getInt(String columnName) throws SQLException返回名为columnName的列中当前行中的int值。
2public int getInt(int columnIndex) throws SQLException返回指定列索引当前行中的int值。列索引从1开始,意味着行的第一列为1,行的第二列为2,依此类推。

类似地,在八个Java基元类型中的每一个的ResultSet接口中都有get方法,以及常见的类型,如java.lang.Stringjava.lang.Objectjava.net.URL等。

还有一些方法可以获取SQL数据类型java.sql.Date,java.sql.Timejava.sql.TimeStampjava.sql.Clobjava.sql.Blob。查看文档以获取有关使用这些SQL数据类型的更多信息。

为了更好的理解,建议学习研究查看结果集示例代码

更新结果集

ResultSet接口包含用于更新结果集的数据的更新方法的集合。

与get方法一样,每种数据类型都有两种更新方法 -

  • 一个是采用列名称。
  • 另一个采用列索引。

例如,要更新结果集当前行的String列,可以使用以下updateString()方法之一:

1public void updateString(int columnIndex, String s) throws SQLException将指定列中的String值更改为指定的s值。
2public void updateString(String columnName, String s) throws SQLException与前前的方法类似,除了使用列的名称而不是列的索引指定。

有八种基本数据类型的更新方法,以及java.sql包中的StringObjectURL和SQL数据类型。

更新结果集中的一行会更改ResultSet对象中当前行的列,但不会更改底层数据库中的列的值。 要更新数据库中的行,需要调用以下方法之一。

1public void updateRow()更新数据库中当前行
2public void deleteRow()从数据库中删除当前行
3public void refreshRow()刷新结果集中的数据以反映数据库中最近的任何更改。
4public void cancelRowUpdates()取消对当前行所做的任何更新。
5public void insertRow()在数据库中插入一行。 只有当光标指向插入行时,才能调用此方法。

为了更好的理解,建议您学习研究“更新结果集示例代码”

05-08 15:47