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()
等方法来设置数据库连接信息编译、运行该程序,编译器不会发出任何警告,程序运行结果也一切正常。