JDBC使用ResultSet卷动、更新数据
2016-09-06 17:07
253 查看
通常,我们在使用JDBC的ResultSet时,默认使用next()移动数据至下一个数据,然后使用getXXX()方法来获得数据,但是这样并不方便,比如在访问完一个数据项后,想向前或者向后、寻找第一条或者最后一条记录项,或者在查看某个数据项后想更新该数据项,这是就用到了JDBC提供的ResultSet卷动、更新数据了。
结果集类型可以指定三种设置:
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:
按照如下方式指定PreparedStatement:
在执行后得到的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卷动,后进行更新的例子:
如果在取得ResultSet后想直接进行数据的新增,则要先调用moveToInsertRow(),之后调用updateXxx()设置新增的数据各个字段,然后调用insertRow()新增数据。
同样如果想在取得ResultSet后直接进行数据的删除,则要移动数据光标到想删除的列,然后调用deleteRow()删除数据列即可。
结果集类型与并行方式
在使用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()删除数据列即可。
相关文章推荐
- 使用JDBC读取本地的Excel文件并批量更新数据
- Java - 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
- 关于JDBC中的ResultSet的更新数据操作
- 使用jdbc更新数据时间时如何屏蔽各种数据库的差异性
- JDBC ResultSet数据更新
- JDBC--使用statement接口实现更新数据
- 使用ResultSet更新数据库
- 使用JDBC连接MySQL数据库--典型案例分析(四)----更新和插入员工数据
- 使用 DataAdapter 和 DataSet 更新数据库
- 方便的使用单击和双击更新DataGrid中的数据的例子
- 方便的使用单击和双击更新DataGrid中的数据的例子
- 使用游标更新表中数据
- [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之四十九:使用SqlDataSource插入、更新以及删除数据
- 使用单击和双击更新DataGrid中的数据的例子
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- 使用JDBC和Hibernate来写入Blob型数据到Oracle中
- 使用JDBC和Hibernate来写入Blob型数据到Oracle中
- JSP培训(7)——使用JDBC完成动态验证、采用MVC完成数据查询
- 使用 DataAdapter 和 DataSet 更新数据库
- 方便的使用单击和双击更新DataGrid中的数据的例子