JDBC 结果集(ResultSet)

从数据库查询中读取数据的 SQL 语句返回结果集中的数据。SELECT 语句是从数据库中选择行并在结果集中查看它们的标准方法。Sql.ResultSet 接口表示数据库查询的结果集。

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

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

  • 导航方法: 用于左右移动光标。

  • Get方法: 用于查看光标所指向的当前行的列中的数据。

  • Update方法:用于更新当前行各列中的数据。然后,更新也可以在基础数据库中更新。

光标可根据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 常量之一,用于指定结果集是只读的还是可更新的。

结果集的类型

可能的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 {
   ....
}

导航结果集

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

返回指定列索引中当前行中的整型数。列索引从1开始,这意味着行的第一列是1,行的第二列是2,依此类推。

同样,在ResultSet接口中,对于八种Java基本类型中的每一种,以及常见类型(如java.lang.String,java.lang.Object和java.net.URL),都有get方法。

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

为了更好地理解,让我们研究查看-Example Code

更新结果集

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包中有八种原始数据类型以及String,Object,URL和SQL数据类型的更新方法。

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

序号方法与说明
1public void updateRow()

通过更新数据库中相应的行来更新当前行。

2public void deleteRow()

从数据库中删除当前行

3public void refreshRow()

刷新结果集中的数据,以反映数据库中最近的任何更改。

4public void cancelRowUpdates()

取消对当前行所做的任何更新。

5public void insertRow()

在数据库中插入一行。只有当光标指向插入行时,才能调用此方法。

为了更好地理解,让我们研究“更新示例代码”