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() は実行を確認するメッセージを表示します。サーバーで例外が発生すると、エラー処理コードにエラーメッセージが表示されます。