- 5.1. カーソルの種類
- 5.2. ResultSetを用いたupdate
- 5.3. ResultSetを用いたinsert
- 5.4. ResultSetを用いたdelete
- 5.5. ResultSetで更新処理を行った場合の可視性
5.2. ResultSetを用いたupdate
ResultSetを用いたupdateについて説明します。
conn.setAutoCommit(false); final String sql="select p_num, p_name, type, price from product"; PreparedStatement statement =conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet result=statement.executeQuery(); while(result.next()){ int price=result.getInt(4); if(price>=1000){ price-=10; result.updateInt(4,price); result.updateRow(); } } conn.commit();
まず「ResultSet.CONCUR_UPDATABLE」を指定して「Statement」を作成します。サンプルでは「PreparedStatement」を使用するので、「prepareStatement」の3つ目の引数に値を指定しています(3行目)。
通常と同じような方法でデータを取得しますが(5・6行目)、もし該当する行のデータを変更したい場合には「updateXXX」メソッドを使用します。サンプルでは、Stringのデータを更新するので「updateString」メソッドを使用します(9行目)。1番目の引数は更新する列番号、2番目の引数は更新後の値です。その他の「updateXXX」メソッドもこれとほぼ同じです。「updateXXX」メソッドを呼び出した後は、「updateRow」メソッドを呼び出します(10行目)。
サンプルでは最後にコミットしています。コネクションが「AutoCommit」モードである場合には、「updateXXX」メソッドが実行されるたびに、更新がデータベースに反映されます。
ResultSetを用いたupdate処理は、update文をSQLで実行するのと大差ないように思われます。しかしデータの取得を行いながらデータの更新を行いたい場合や、条件によって処理を変えたい場合(例えば1000以上は10引いて、100以下の場合は10上乗せする等)にはこの方法は有用です。
最後に1つ注意があります。ResultSetを用いた更新処理を行う場合、実行するSQL文に「*」を使用することはできません。また複数のテーブルを結合するようなSQL文も使用することができません。
(実習課題1)
以下のコンソールアプリケーションを作成しなさい。
- まず「product」テーブルの値を表示する。
- 表示しつつ「price」が500以上であるものの値を、1割引にする事。
- プログラム実行後、データベースの値が更新されている事を確認する事。