通常,我们在使用JDBC的ResultSet时,默认使用next()移动数据至下一个数据,然后使用getXXX()方法来获得数据,但是这样并不方便,比如在访问完一个数据项后,想向前或者向后、寻找第一条或者最后一条记录项,或者在查看某个数据项后想更新该数据项,这是就用到了JDBC提供的ResultSet卷动、更新数据了。
结果集类型与并行方式
在使用Connection的createStatement()或preparedStatement()方法穿件Statement或PreparedStatement实例时,可以指定结果集类型与并行方式:
createStatement(int resultSetType, int resultSetConcurrency)
preparedStatement(String sql, int resultSetType, int resultSetConcurrency)
结果集类型可以指定三种设置:
- ResultSet.TYPE_FORWARD_ONLY(默认):只能前进数据光标
- ResultSet.TYPE_SCROLL_INSENSITIVE:可以前后移动光标
- ResultSet.TYPE_SCOLL_SENSITIVE:可以前后移动光标
ResultSet.TYPE_SCROLL_INSENSITIVE与ResultSet.TYPE_SCROLL_SENSITIVE的区别在于ResultSet.TYPE_SCROLL_INSENSITIVE取得的ResultSet不会反应数据库中的数据修改,而ResultSet.TYPE_SCROLL_SENSITIVE会反应数据库中的数据修改。
更新设置可以有两种指定:
- ResultSet.CONCUR_READ_ONLY(默认):只能进行数据的读取
- ResultSet.CONCUR_UPDATEABLE:可以使用ResultSet进行数据的更新
在使用Connection的createStatement()或preparedStatement()方法创建Statement或PreparedStatement实例时,若没有指定结果集和并行方式,默认就是TYPE_FORWARD_ONLY与ResultSet.CONCUR_READ_ONLY。如果想前后移动数据光标并且想使用ResultSet进行更新,则可以按找如下方式创建Statement:
Statement stmt = conn.creteStatement(ResultSet.TYPE_SCOLL_INSESITIVE, ResultSet.CONCUR_UPDATEABLE);
按照如下方式指定PreparedStatement:
PreparedStatement stmt = conn.preparedStatement("<SQL String>", ResultSet.TYPE_SCOLL_INSESITIVE, ResultSet.CONCUR_UPDATEABLE);
在执行后得到的ResultSet就可以使用absolute()、afterLast()、beforeFirst()、first()、last()进行绝对位置的移动,使用relative()、previous()、next()进行相对位置移动,移动成功返回true,也可以用isAfterLast()、isBeforeFirst()、isFirst()、isLast()判断目前的位置。
使用ResultSet进行数据的修改,则有以下条件限制:
- 必须选择单一表格
- 必须选择主键
- 必须选择所有NOT NULL的值
- 在SQL语句中不能使用函数
如果要在取得ResultSet之后进行数据的更新,必须移动至要更新的行,调用updateXxx()方法(Xxx为类型),然后调用updateRow()方法完成更新。如果调用cancelRowUpdate()可取消更新,但必须在调用updateRow()前进行更新的取消。
如下是一个先进行ResultSet卷动,后进行更新的例子:
stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stat.executeQuery("select * from userinfo where flag = 0");
if(<condition is true>){
rs.absolute( <num> ); //移动到某一行
rs.updateInt("flag", 1);
rs.updateRow(); //完成更新
}
如果在取得ResultSet后想直接进行数据的新增,则要先调用moveToInsertRow(),之后调用updateXxx()设置新增的数据各个字段,然后调用insertRow()新增数据。
同样如果想在取得ResultSet后直接进行数据的删除,则要移动数据光标到想删除的列,然后调用deleteRow()删除数据列即可。