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

多くのアプリケーションは同じSQLステートメントを繰り返し実行し、各反復の間にステートメント内の1つ以上のデータ値を変更します。 Statementオブジェクトを使用してSQLステートメントを繰り返し実行する場合、サーバーは毎回ステートメントを解析、計画、および最適化する必要があります。 JDBCは別の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()は実行を確認するメッセージを表示します。サーバーで例外が発生すると、エラー処理コードにエラーメッセージが表示されます。