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