JDBC ResultSet 结果集

JDBC 执行 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);

其中,方法中参数:

  • 参数 RSType 用于指定 ResultSet 对象的类型;
  • 参数 RSConcurrency 用于指定结果集是只读还是可更新。

 

1. ResultSet 类型取值

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

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

 

2. ResultSet 并发性取值

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

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

 

3. 创建 Statement 范例

初始化一个 Statement 对象来创建一个向前只读的 ResultSet 对象:

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

 

4. ResultSet 移动光标的方法

编号 方法 描述
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 如果光标当前位于插入行,则将光标移回当前行; 否则,此方法什么也不做

 

5. ResultSet 读取结果集的方法

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

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

  • 一个是采用列名称。
  • 另一个采用列索引。
序号 方法 描述
1 public int getInt(String columnName) throws SQLException 返回名为columnName的列中当前行中的int值。
2 public int getInt(int columnIndex) throws SQLException 返回指定列索引当前行中的int值。列索引从1开始,意味着行的第一列为1,行的第二列为2,依此类推。

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

还有一些方法可以获取 SQL 数据类型 java.sql.Date,java.sql.Time,java.sql.TimeStamp,java.sql.Clob 和 java.sql.Blob。

 

6. ResultSet 更新结果集的方法

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

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

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

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

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

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

JDBC ResultSet 通过移动光标的方法浏览结果集。ResultSet 移动光标的方法。public void beforeFirst() throws SQLException 将光标移动到第一行之前。public void afterLast() throws SQLException 将光标移动到最后一行之后。