MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

JDBCプログラムでResultSetの内容を更新する方法をわかりやすく解説

JDBCで取得した ResultSet の内容を直接更新したい場合は、通常の読み取り専用の結果セットではなく、更新可能(updatable)なResultSet を生成する必要があります。そのためには、Statement オブジェクトを作成する際に、ResultSetのタイプと同時実行モードを指定します。

1. 更新可能なStatementを作成する

createStatement() メソッドの引数に、スクロールタイプと CONCUR_UPDATABLE を渡すことで、更新可能なResultSetを扱えるようになります。

// Statementオブジェクトの作成
Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE);

2. updateXXX()メソッドを使って行を更新する

ResultSet インターフェースには、データを取得するための getXXX() メソッドや、パラメータを設定する setXXX() メソッドが用意されていますが、それらに加えて現在の行の内容を更新するための updateXXX() メソッドも提供されています。

これらのメソッドには、更新対象の列を指定するために、列インデックスを表す整数値、または列ラベル(カラム名)を表す文字列のいずれかを引数として渡します。

注意: ResultSetの内容を更新するには、対象となるテーブルに主キー(プライマリキー)が設定されている必要があります。主キーがないテーブルに対しては更新操作が正しく機能しない場合があります。

3. サンプルプログラム

ここでは、次のような5件のレコードを持つ Employees テーブルを例に説明します。

+----+---------+--------+----------------+
| Id | Name    | Salary | Location       |
+----+---------+--------+----------------+
|  1 | Amit    | 3000   | Hyderabad      |
|  2 | Kalyan  | 4000   | Vishakhapatnam |
|  3 | Renuka  | 6000   | Delhi          |
|  4 | Archana | 9000   | Mumbai         |
|  5 | Sumith  | 11000  | Hyderabad      |
+----+---------+--------+----------------+

以下のサンプルでは、全従業員の給与(Salary)を5000増加させた後、特定のレコードを削除する一連の流れを実装しています。

import java.sql.*;
public class ResultSetExample {
    public static void main(String[] args) throws Exception {
        // ドライバの登録
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        // コネクションの取得
        String mysqlUrl = "jdbc:mysql://localhost/TestDB";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        System.out.println("Connection established......");
        // Statementオブジェクトの作成
        Statement stmt = con.createStatement(
            ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        // データの取得
        ResultSet rs = stmt.executeQuery("select * from Employees");
        // テーブルの内容を表示
        System.out.println("Contents of the table: ");
        printRs(rs);
        // カーソルを先頭に移動
        rs.beforeFirst();
        // 全従業員の給与を5000増加させる
        while(rs.next()){
            // 列名を指定して値を取得
            int newSal = rs.getInt("Salary") + 5000;
            rs.updateInt( "Salary", newSal );
            rs.updateRow();
        }
        System.out.println("Contents of the ResultSet after increasing salaries");
        printRs(rs);
        // 2番目のレコードへ移動
        rs.beforeFirst();
        rs.absolute(2);
        System.out.println("Record we need to delete: ");
        System.out.print("ID: " + rs.getInt("id"));
        System.out.print(", Salary: " + rs.getInt("Salary"));
        System.out.print(", Name: " + rs.getString("Name"));
        System.out.println(", Location: " + rs.getString("Location"));
        System.out.println(" ");
        // 行の削除
        rs.deleteRow();
        System.out.println("Contents of the ResultSet after deleting one records...");
        printRs(rs);
        System.out.println("Goodbye!");
    }
    public static void printRs(ResultSet rs) throws SQLException{
        // 必ず先頭行から開始する
        rs.beforeFirst();
        while(rs.next()){
            System.out.print("ID: " + rs.getInt("id"));
            System.out.print(", Salary: " + rs.getInt("Salary"));
            System.out.print(", Name: " + rs.getString("Name"));
            System.out.println(", Location: " + rs.getString("Location"));
        }
        System.out.println();
    }
}

4. 実行結果

上記のプログラムを実行すると、以下のように出力されます。給与が5000増加し、ID:2のレコードが削除されていることが確認できます。

Connection established......
Contents of the table:
ID: 1, Salary: 3000, Name: Amit, Location: Hyderabad
ID: 2, Salary: 4000, Name: Kalyan, Location: Vishakhapatnam
ID: 3, Salary: 6000, Name: Renuka, Location: Delhi
ID: 4, Salary: 9000, Name: Archana, Location: Mumbai
ID: 5, Salary: 11000, Name: Sumith, Location: Hyderabad
Contents of the resultset after increasing salaries
ID: 1, Salary: 8000, Name: Amit, Location: Hyderabad
ID: 2, Salary: 9000, Name: Kalyan, Location: Vishakhapatnam
ID: 3, Salary: 11000, Name: Renuka, Location: Delhi
ID: 4, Salary: 14000, Name: Archana, Location: Mumbai
ID: 5, Salary: 16000, Name: Sumith, Location: Hyderabad
Record we need to delete:
ID: 2, Salary: 9000, Name: Kalyan, Location: Vishakhapatnam
Contents of the resultset after deleting one records...
ID: 1, Salary: 8000, Name: Amit, Location: Hyderabad
ID: 3, Salary: 11000, Name: Renuka, Location: Delhi
ID: 4, Salary: 14000, Name: Archana, Location: Mumbai
ID: 5, Salary: 16000, Name: Sumith, Location: Hyderabad
Goodbye!

まとめ

  • ResultSetを更新するには、createStatement() の第2引数に ResultSet.CONCUR_UPDATABLE を指定してStatementを作成する。
  • 行の更新には updateXXX() メソッドを使い、変更を確定するには updateRow() を呼び出す。
  • 行の削除には deleteRow() メソッドを使用する。
  • 更新・削除操作を行うテーブルには主キーが必要である。
  1. JavaScriptでユーザーが選択したテキストを取得・表示する方法

    Webページ上でユーザーがマウスなどでドラッグして選択したテキストの内容を取得したい場合、JavaScriptのwindow.getSelection()メソッドを利用します。このメソッドは現在の選択範囲を表すSelectionオブジェクトを返し、toString()を呼び出すことで選択された文字列をそのまま取り出せます。以下は、ユーザーが選択したテキストを取得し、ボタンのクリックで画面に表示するサンプルコードです。サンプルコード<!DOCTYPE html> <html lang="ja"> <head> <meta charse

  2. iPhoneの天気アプリをモバイルデータ通信で更新する方法

    iPhoneの天気アプリがWi-Fiでしか更新されない理由iPhoneで天気アプリを使うのはごく当たり前のことに思えますが、実は少し変わった仕様があります。それは、Wi-Fiに接続していないと天気情報が更新されないという点です。最新の天気情報を取得したい場合は、いくつかの設定を見直す必要があります。この記事では、その具体的な対処法をわかりやすく解説します。天気アプリに起こる不具合の症状標準の天気アプリは、現在地の天候を表示してくれる便利なアプリです。しかし、自宅など元の所在地を離れてからアプリを更新しても、情報が反映されないことがあります。また、新しい都市や地域を追加しようとしても、画面が真っ