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()
涵數將會使遊標向後移動,使的數據更新失敗.