RowSet是javax.sql包下面的一个接口,继承自ResultSet接口,在1.4版本中被引入。不过当时只有孤零零的这么一个接口,JDK并没有提供更多细分的类别。我们来看看5.0版本中javax.sql.RowSet新增了哪些有趣的子接口。
继承关系大概是这样的:
ResultSet
|-- RowSet
|-- CachedRowSet
| |-- WebRowSet
| |-- JoinRowSet
| |-- FilteredRowSet
|-- JdbcRowSet
|-- SyncResolver
JdbcRowSet - 用来封装实现了JDBC的结果集;
CachedRowSet - 轻量的数据容器,仅当需要读取或写入数据库时才进行连接,其他时候虽然你可以对它进行修改/更新操作,但它与数据库是断开的,我们可以看到WebRowSet、JoinRowSet和FilteredRowSet都是它的子接口;
FilteredRowSet - 用来获取数据子集;
JoinRowSet - 通过多个RowSet接口的类的实例实现SQL JOIN查询;
WebRowSet - 使用标准的XML格式处理表格化的数据;
SyncResolver - 提供一种处理同步冲突的框架/机制。
使用CachedRowSet,以及它定义好的子接口,只要JDBC驱动的提供商给出具体的实现,我们就可以很方便的处理异步的数据对象,在需要的时候才进行数据库连接,免去了不少资源占用。基本上,你需要做的就是给出连接参数和SQL语句,操作返回的结果,然后把修改提交回数据源即可,具体的细节都被封装好了。
对那些刚接触JDBC的朋友,我想说的是,虽然你看到的都是接口,但这正是JDBC的特色和优点所在,JDBC API的设计者把接口(顺带其功能)定义好,就像是写下了一纸契约,具体的数据库厂商或者第三方遵照这一契约来实现这些接口,而对于我们使用JDBC的一方则可以放心的按照契约调用定义好的方法,而不必担心这些方法不存在或者没有实现等。哪怕我们换掉数据库,我们面对的还是那些API,只要新数据库同样有这样一组实现了JDBC的驱动。(现实中大项目做到这一步还比较困难,但这又是另一回事了。)这正是面向接口编程的精粹。
回到我们的RowSet新增子接口,它们存在的目的同样是定义好一组标准的行为,让具体的JDBC的提供者去实现,我们在另一端直接使用就OK了。
更详细的内容,参考这里。