PreparedStatementsを使用してSQLコマンドを送信する

多くのアプリケーションは同じSQLステートメントを繰り返し実行し、各反復の間にステートメント内の1つ以上のデータ値を変更します。 Statement オブジェクトを使用してSQLステートメントを繰り返し実行する場合、サーバーはステートメントを毎回解析、計画、および最適化する必要があります。JDBCは、このようなシナリオで必要な作業量を削減するために、もう1つの Statement 派生物、 PreparedStatement を提供します。

リスト1.6は、従業員IDと従業員名を受け入れ、その従業員情報を emp テーブルに挿入する PreparedStatement の呼び出しを示しています。

リスト1.6

public void AddEmployee(Connection con)
{
  try
  {
    Console c = System.console();
    String command = "INSERT INTO emp(empno,ename) VALUES(?,?)";
    PreparedStatement stmt = con.prepareStatement(command);
    stmt.setObject(1,new Integer(c.readLine("ID:")));
    stmt.setObject(2,c.readLine("Name:"));
    stmt.execute();

    System.out.println("The procedure successfully executed.");
  }
  catch(Exception err)
  {
     System.out.println("An error has occurred.");
     System.out.println("See full details below.");
     err.printStackTrace();
  }
}

SQLステートメントにデータ値をハードコーディングする代わりに、 placeholders を挿入して、各反復で変化する値を表します。リスト1.6は、2つのプレースホルダー(それぞれが疑問符で表される)を含む INSERT ステートメントを示しています。

String command = "INSERT INTO emp(empno,ename) VALUES(?,?)";

パラメータ化されたSQLステートメントを手にすると、 AddEmployee() メソッドは Connection オブジェクトにそのステートメントを準備して PreparedStatement オブジェクトを返すように要求できます:

PreparedStatement stmt = con.prepareStatement(command);

この時点で、 PreparedStatement は INSERT ステートメントを解析および計画しましたが、テーブルに追加する値はわかりません。 PreparedStatement を実行する前に、 setter メソッドを呼び出して各プレースホルダーの値を指定する必要があります。 setObject() には2つの引数が必要です。

  • パラメータ番号。パラメータ番号1は最初の疑問符に対応し、パラメータ番号2は2番目の疑問符に対応します。

  • プレースホルダーを置き換える値。

AddEmployee() メソッドは、ユーザーに従業員IDと名前の入力を求め、ユーザーが指定した値で setObject() を呼び出します。

stmt.setObject(1,new Integer(c.readLine("ID:")));
stmt.setObject(2, c.readLine("Name:"));

そして PreparedStatement オブジェクトにステートメントを実行するように要求します:

stmt.execute();

SQLステートメントが期待どおりに実行される場合、 AddEmployee() は実行を確認するメッセージを表示します。サーバーで例外が発生すると、エラー処理コードにエラーメッセージが表示されます。