管理结果集

可滚动、可更新(可修改)的结果集

使用absolute()、previous()、afterLast()等方法自由移动记录指针的ResultSet被称为可滚动的结果集。
在Java 5.0以后,默认打开的ResultSet()就是可滚动的。

以默认方式打开的ResultSet是不可更新的,必须要传入额外参数。Connection在创建Statement或PreparedStatement时,
传入如下两个参数:

  1. resultSetType:可取三个值

    • ResultSet.TYPE_FORWARD_ONLY:控制记录指针只能向前移动。
    • ResultSet.TYPE_SCROLL_INSENSITINE:记录指针可以自由移动(可滚动结果集),但底层数据改变不会影响ResultSet 的内容。
    • ResultSet.TYPE_SCROLL_SENSTTIVE:记录指针可以自由移动(可滚动结果集),底层数据改变会影响ResultSet 的内容。
  2. resultSetConcurrency:控制ResultSet的并发类型,可接收两个值。

    • ResultSet.CONCUR_READ_ONLY:指示ResultSet是只读的并发模式(默认)

    • ResultSet.CONCUR_UPDATABLE:指示ResultSet是可更新的并发模式

      例子:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      import java.util.*;
      import java.io.*;
      import java.sql.*;

      public class ResultSetTest
      {
      private String driver;
      private String url;
      private String user;
      private String pass;
      public void initParam(String paramFile) throws Exception
      {
      // 使用Properties类来加载属性文件
      var props = new Properties();
      props.load(new FileInputStream(paramFile));
      driver = props.getProperty("driver");
      url = props.getProperty("url");
      user = props.getProperty("user");
      pass = props.getProperty("pass");
      }
      public void query(String sql) throws Exception
      {
      // 加载驱动
      Class.forName(driver);
      try (
      // 获取数据库连接
      Connection conn = DriverManager.getConnection(url, user, pass);
      // 使用Connection来创建一个PreparedStatement对象
      // 传入控制结果集可滚动,可更新的参数。
      PreparedStatement pstmt = conn.prepareStatement(sql,
      ResultSet.TYPE_SCROLL_INSENSITIVE,
      ResultSet.CONCUR_UPDATABLE);
      ResultSet rs = pstmt.executeQuery())
      {
      rs.last();
      int rowCount = rs.getRow();
      for (var i = rowCount; i > 0; i--)
      {
      rs.absolute(i);
      System.out.println(rs.getString(1) + "\t"
      + rs.getString(2) + "\t" + rs.getString(3));
      // 修改记录指针所有记录、第2列的值
      rs.updateString(2, "学生名" + i);
      // 提交修改
      rs.updateRow();
      }
      }
      }
      public static void main(String[] args) throws Exception
      {
      var rt = new ResultSetTest();
      rt.initParam("mysql.ini");
      rt.query("select * from student_table");
      }
      }

      使用ResultSetMetaData分析结果集

      如果程序需要了解ResultSet里包含哪些数据列,以及每个数据列的数据类型,可以通过ResultSetMetaData来获取关于ResultSet的描述信息。

      ResultSet里包含一个getMetaData()方法,该方法返回该ResultSetMetaData对象,然后通过ResultSetMetaData提供的方法返回ResultSet的描述信息。常有方法有如下三个:

      函数原型功能参数
      int getColumnCount()返回该ResultSet的列的数量
      String getColumnName(int column)返回指定索引的列名column:指定索引
      int getColumnType(int column)返回指定索引列类型column:指定索引

      使用RowSet 1.1 包装结果集

      RowSet接口继承了ResultSet接口,RowSet接口包括JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet和WebRowSet常用子接口,其中JdbcRowSet需要保持与数据库的连接之外,其余四个子接口都是离线的RowSet,不需要保持与数据库的连接。

      RowSet默认是可滚动、可更新、可序列化的结果集,对于离线的RowSet而言,程序在创建RowSet时已经把数据从底层数据库读取到了内存中,因此可以充分利用计算机的内存,从而降低数据库服务器的负载。

      RowSetFactory与RowSet

      RowSetProvider类负责创建RowSetFactory,而RowSetFactory提供以下方法创建RowSet实例。

      • CachedRowSet createCachedRowSet():创建一个默认的CachedRowSet。
      • FilterRowSet createFilterRowSet():创建一个默认的FilterRowSet

管理结果集
https://zhaoquaner.github.io/2022/05/11/Java/JDBC/管理结果集/
更新于
2022年5月22日
许可协议