在默认情况下,结果集是不可以滚动和不可以更新的。要得到一个可滚动的结果集,在生成Statement或PreparedStatement时,应预先通知conn
Statement stat = conn.createStatement(type, sql);
PreparedStatement ps =conn.prepatedStatement(sql, type, concurrency);
type值为TYPE_FORWARD_ONLY(不能滚动)、TYPE_SCROLL_INSENSITIVE(可以滚动,但对数据库变化不敏感)、TYPE_SCROLL_SENSITIVE(可滚动,对数据库变化敏感)
concurrency的值为CONCUR_READ_ONLY(结果集不能更新数据库<默认值>)、CONCUR_UPDATABLE(结果集可更新数据库)
并非所有的数据库驱动程序都支持可滚动和可更新的结果集,我们可以使用DatabaseMetaDate类中的supportsResultSetType和supportsResultSetConcurrency方法,获得使用的驱动程序时,某个数据库究竟支持哪些结果集类型和哪些并发模式。
如果希望编辑结果集中的数据,并将结果集上的数据变更自动反应到数据库中,那么就得使用可更新的结果集。可更新的结果集并不一定是可滚动的。
并非所有的查询都会返回可更新的结果集。如果查询涉及多个表格的连接操作,那么它所产生的结果集将是不可以更新的。如果查询只涉及一个表格,或在查询时是使用主键连接多个表格的,那么它所产生的结果集将是可更新的结果集。可以调用ResultSet类中的getConcurrent方法来确定结果集是不是可以更新。
与ResultSet中的getXxx方法相同的是,该类中也有UpdateXxx方法,该类方法只是改变结果集中的行值,而非数据库中的值。当更新完行中的字段值后,必须调用updateRow方法,将当前行中的所有信息发送给数据库;如果没有调用updateRow方法就将光标移动到其它行上,那么所有的更新信息都将被行集丢弃,而且不会传递给数据库。
ResultSet类中的updateRow、insertRow和deleteRow方法的执行效果等同于SQL命令中的UPDATE、INSERT和DELETE。但是如果要更新一个结果集中的数据,执行UPDATE语句要比建立一个查询,然后一边遍历一边修改数据显得高效的多。