JDBC 采用ResultSet方式更新数据库的时候,有机几点需要注意.首先,就是采用的select语句,当使用*作为搜索返回结果集的
时候,JDBC将默认的将ResultSet强制设置为ReadOnly模式.
如果采用ResultSet的更新模式,需要将statement设置为ResultSet.CONCUR_UPDATABLE.
Statement 的参数:
默认设置:statement 为Type_FORWARD_ONLY并带有并发CONCUR_READ_ONLY.的并发级别.
TYPE_FORWARD_ONLY,表示指针只能向前移动
TYPE_SCOLL_INSENSITIVE 可滚动但通常不受其它的更改影响.
TYPE_SCOLL_SENSITIVE 可滚动,并且通常受其它的更改影响.
当使用ResultSet的update的时候,一定需要将游标定位到当前行,否则程序不会抛出异常,但是数据会更新错误
conn.setAutoCommit(false);
pstm = conn
.prepareStatement(getTotalNum,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);
pstm.setString(1, "total");
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
Integer total = Integer.valueOf(rs.getString("value"));
total -= 2;
System.out.println(total);
rs.updateInt("value", total);
rs.updateRow();
} //------------------------ 1
conn.commit();
上述片段能够正常更新数据,但是如果当rs.updateRow()防在1之后,该数据将不能正常的更新,原因在于当使用rs.next()
涵数将会使游标向后移动,使的数据更新失败.