关于RowSet

63 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

前面我们已经了解过ResultSet时访问数据库的结果集,接下来我们学习与ResultSet非常相似却又不同的RowSet。

RowSet的引入:

代表数据库查询结果的ResultSet是一个在线的数据集,在读取数据的过程中不能断开与数据库连接,只有读取数据完成后才能关掉相关对象。因此,如果并发访问的客户端比较多的话,大量的连接会对数据库造成很大的负担。为了解决这一问题,新的JDBC规范中引入了离线数据集Rowset。

与ResultSet相比,RowSet的离线操作能够有效地利用计算机的内存,减轻数据库服务器的负担。由于数据操作都是在内存中进行,然后批量提交到数据源,所以灵活性和性能都有了很大的提高。RowSet默认是一个可滚动、可更新、可序列化的结果集,而且它作为JavaBean,可以方便地在网络间传输。

RowSet的定义:

RowSet包括CachedRowSet、WebRowSet、FilteredRowSet、JoinRowSet和JdbcRowSet五个子类。其中只有JdbcRowSet是连接类型的,它通常用来包装那些由于数据库驱动不支持Resultset的滚动和更新的场景,以方便用户使用。其他几个子类都是非连接类型的,只有在读取或写入数据库时才会连接数据库,在大部分时间都是非连接的。CachedRowSet是最常用的一种RowSet。其他三种RowSet(WebRowSet、FilteredRowSet、JoinRowSet)都是直接或间接继承于它并进行了扩展。

需要说明的是,RowSet继承了ResultSet接口,因此,前面介绍的对ResultSet的操作方法都适用于RowSet。

RowSet的使用:

(1)execute

使用execute()填充CachedRowSet时,需要设置数据库连接参数和查询命令command,如下示例代码:

 cachedRS.setUrl(DBCreator.DERBY_URL);
 cachedRS.setCommand(DBCreator.SQL_SELECT_CUSTOMERS);
 cachedRS.setUsername("APP");
 cachedRS.setPassword("APP");
 cachedRS.execute();

在上面的代码中,CachedRowSet根据设置的url、username、password三个参数创建一个数据库连接,然后执行查询命令command,用结果集填充CachedRowSet,最后关闭数据库连接。

(2)populate(ResultSet)

利用CachedRowSet操作数据的方法与ResultSet几乎相同,也是操作光标到指定位置,根据每列的类型调用对应的updateXXX(index, updateValue),再调用updateRow方法。由于CachedRowSet是离线数据集,因此此时只是在内存中更新了该行。如果是调用execute方法获得到CachedRowSet,则它包含了连接数据库的信息,调用方法acceptChanges()同步到数据库;如果是以populate(ResultSet)方法获得的,则必须调用方法acceptChanges(Connection)将结果集中的信息同步到数据库。

利用CachedRowSet操作数据的方法与ResultSet几乎相同,也是操作光标到指定位置,根据每列的类型调用对应的updateXXX(index, updateValue),再调用updateRow方法。由于CachedRowSet是离线数据集,因此此时只是在内存中更新了该行。如果是调用execute方法获得到CachedRowSet,则它包含了连接数据库的信息,调用方法acceptChanges()同步到数据库;如果是以populate(ResultSet)方法获得的,则必须调用方法acceptChanges(Connection)将结果集中的信息同步到数据库。

(3)分页

在对数据库进行查询过程中,查询的结果经常是大量记录的集合,查询结果的显示过程经常涉及数据的分页显示问题。由于CachedRowSet是将数据临时存储在内存中,因此对于许多SQL查询,会返回大量的数据。如果将整个结果集全部存储在内存中会占用大量的内存,有时甚至是不可行的。对此,CachedRowSet提供了分批从ResultSet中获取数据的方式,这就是分页。应用程序可以简单地通过setPageSize设置一页中数据的最大行数。也就是说,如果页大小设置为5,一次只会从数据源获取5条数据。

本次通过较多系统的语言描述RowSet,以上就是关于对RowSet的认识,后续也会通过实例形象具体的演示RowSet的使用。