JDBC使用ResultSet卷动、更新数据

通常,我们在使用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()删除数据列即可。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值