13.6 Java7的RowSet1.1 13.6.1 Java 7新增的RowSetFactory与RowSet
13.6 Java7的RowSet1.1
RowSet接口继承了ResultSet接口, RowSet接口下包含JdbcRowSet、 CachedRowSet、 FilteredRowSet、JoinRowset和WebRowSet常用子接口。除了JdbcRowSet需要保持与数据库的连接之外,其余4个子接口都是离线的RowSet,无须保持与数据库的连接。
与ResultSet相比, RowSet默认是可滚动、可更新、可序列化的结果集,而且作为JavaBean使用,因此能方便地在网络上传输,用于同步两端的数据。对于离线RowSet而言,程序在创建RowSet时已把数据从底层数据库读取到了内存,因此可以充分利用计算机的内存,从而降低数据库服务器的负载,提高程序性能。
图13.22显示了RowSet规范的接口类图。
CachedRowSet及其子接口都代表了离线RowSet,它们都不需要底层数据库连接。
13.6.1 Java 7新增的RowSetFactory与RowSet
在Java 6.0以前, RowSet及其5个子接口都已经存在了,但在实际编程中的应用一直并不广泛,这是因为Java公开API并没有为RowSet及其各子接口提供实现类,而且也没有提供公开的方法来创建RowSet及其各子接口的实例。
实际上,Java6.0已经在com.sun.rowset包下提供了JdbcRowSetlmpl、 CachedRowSetlmpl、WebRowSetlmpl、 FilteredRowSetlmpl和JoinRowSetlmpl五个实现类,它们代表了各种RowSet接口的实现类
以JdbcRowSet为例,在Java 6.0及以前的版本中,如果程序需要使用JdbcRowSet,则必须通过调用JdbcRowSetlmpl的构造器来创建JdbcRowSet实例, JdbcRowSetlmpl提供了如下常用构造器.
| 方法 | 描述 |
|---|---|
JdbcRowSetlmpl() |
创建一个默认的JdbcRowSetlmpl对象。 |
JdbcRowSetImpl(Connection conn) |
以给定的Connection对象作为数据库连接来创建JdbcRowSetlmpl对象。 |
JdbcRowSetlmpl(ResultSet rs) |
创建包装ResultSet对象的JdbcRowSetlmpl对象. |
除此之外, RowSet接口中定义了如下常用方法。
| 方法 | 描述 |
|---|---|
setUrl(String ur) |
设置该 RowSet要访问的数据库的URL |
setUsername(String name) |
设置该RowSet要访问的数据库的用户名。 |
setPassword(String password) |
设置该RowSet要访问的数据库的密码。 |
setCommand(String sql) |
设置使用该sql语句的查询结果来装填该RowSet。 |
execute() |
执行查询 |
populate(ResultSet rs) |
让该RowSet直接包装给定的 ResultSet对象. |
通过JdbcRowSet的构造器和上面几个方法不难看出,为JdbcRowSet装填数据有如下两种方式。 |
- 1.创建
JdbcRowSetlmpl时,直接传入ResultSet对象。 - 2.使用
execute()方法来执行SQL査询,用查询返回的数据来装填RowSet.
对于第二种方式来说,如果创建JdbcRowSetlmpl时已经传入了Connection参数,则只要先调用setCommand(String sql)指定SQL查询语句,接下来就可调用execute()方法执行查询了。如果创建JdbcRowSetlmpl时没有传入Connection参数,则先要为JdbcRowSet设置数据库的URL、用户名、密码等连接信息
下面程序通过JdbcRowSetlmpl示范了使用JdbcRowSet的可滚动、可修改特性.
1 | import java.util.*; |
上面程序中①号代码创建一个JdbcRowSetlmpl实例,这就是一个JdbcRowSet对象。接下来的代码则示范了JdbcSet的可滚动、可修改的特性。
编译该程序,编译器将会在①号代码处发出警告: JdbcRowSetlmpl是内部专用AP,可能会在未来发行版中删除。这就是直接使用JdbcRowSetImpl的代价.
需要说明的是,使用JdbcRowSetlmpl除了编译器会发出警告之外,还有如下坏处。
- 程序直接与
JdbcRowSetlmpl实现类耦合,不利于后期的升级、扩展。 JdbcRowSetlmpl实现类不是一个公开的API,未来可能被删除。
正是因为上面两个原因,所以在Java 6.0时代, RowSet并未得到广泛应用。Java 7新增了RowSetProvider类和Row SetFactory接口,其中RowSetProvider负责创建RowSetFactory,而RowSetFactory则提供了如下方法来创建RowSet实例。
| 方法 | 描述 |
|---|---|
CachedRowSet createCachedRowSet() |
创建一个默认的CachedRowSet |
FilteredRowSet createFilteredRowSet() |
创建一个默认的FilteredRowSet |
JdbcRowSet createJdbcRowSet() |
创建一个默认的JdbcRowSet |
JoinRowSet createJoinRowSet() |
创建一个默认的JoinRowSet |
WebRowSet createWebRowSet() |
创建一个默认的WebRowSet |
通过使用RowSetFactory,就可以把应用程序与RowSet实现类分离开,避免直接使用JdbcRowSetlmpl等非公开的API,也更有利于后期的升级、扩展。
下面程序使用RowSetFactory来创建JdbcRowSet实例。
1 | import java.util.*; |
上面程序中使用了RowSetFactory来创建JdbcRowSet对象,这就避免了与JabcRowSetlmpl实现类耦合。由于通过这种方式创建的JdbcRowSet还没有传入Connection参数,因此程序还需调用setUrl()、 setUsername()、 setPassword()等方法来设置数据库连接信息编译、运行该程序,编译器不会发出任何警告,程序运行结果也一切正常。