目次へ

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割引にする事。
  • プログラム実行後、データベースの値が更新されている事を確認する事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ