ResulSet类型和选项
Connection提供了三种不同的方法来创建Statement:
createStatement()
createStatement(int resultSetType, int resultSetConcurrency)
createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
其中resultSetType,resultSetConcurrency,resultSetHoldability是三个很让人迷惑的参数,用于设置结果集的一些选项。三个参数的可选值均定义在ResultSet接口中。
resultSetType 结果集类型
ResultSet.TYPE_FORWARD_ONLY 表示结果集只能向前滚动。即我们只能通过ResultSet的next()方法逐行读取数据。
ResultSet.TYPE_SCROLL_INSENSITIVE 和 ResultSet.TYPE_SCROLL_SENSITIVE 这两者均表示结果集可以向前或向后滚动。即我们除了通过ResultSet的next()方法读取数据外,还可以通过first(),last(),preview()等方法自由定位数据。两者的区别在于前者对数据库的修改不敏感,即ResultSet打开后,此时有其他程序更新了数据库,在结果集中并不会反映出来。比如,其他程序插入了一条新数据,在本结果集中不会读取它。而后者则相反,它对数据库的修改敏感,即ResultSet打开后,其他程序对数据库的修改,它的后续读取中能够反映出来。
resultSetConcurrency 结果集是否可更新
ResultSet.CONCUR_READ_ONLY 结果集是只读的,不可更新。
ResultSet.CONCUR_UPDATABLE 结果集可更新。即ResultSet打开后,可以在它的基础上调用ResultSet上的updateXXX,insertRow,deleteRow等方法修改结果集。
resultSetHoldability 结果集提交后是否还是打开的
ResultSet.HOLD_CURSORS_OVER_COMMIT 当Connection的commit调用后,ResultSet不被关闭,还是打开状态。
ResultSet.CLOSE_CURSORS_AT_COMMIT 当Connection的commit调用后,ResultSet被关闭。
RowSet
ResultSet在数据操作过程中要始终保持数据库的连接,使得JDBC在某些场合使用上存在一些性能问题,而在微软平台的ADO技术中早就存在各种断开连接的数据操作对象。为此,JDBC3.0提出了RowSet接口,旨在定义断开连接的数据集以及提供类似ADO的编程接口来操作数据库。从JDK5.0开始,RowSet得到全面强化,javax.sql.rowset包中提供了若干RowSet子接口,并都提供了标准实现。
下面是RowSet的五个子接口:
JdbcRowSet 保持连接的RowSet,它和一个具有ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的ResultSet功能相当。
CachedRowSet 断开连接的RowSet,以缓存的方式实现离线的数据集操作。
WebRowSet 可与XML互相转换的RowSet,继承自CachedRowSet。有点类似ORM的意思,不同的是它为XML和Relation Data之间提供映射。
FilteredRowSet 可通过过滤条件得到数据集的子集的RowSet,继承自WebRowSet。Predicate是过滤器接口。
JoinRowSet 对数据集进行Join连接查询得到的RowSet,继承自WebRowSet。 它和SQL语句的join操作效果类似。