JDBCのPreparedStatement


以前、プログラムでSQLを使用してデータベースにアクセスした場合、フィールド値を直接「+」でSQLに埋め込みました.たとえば、String sql=「selects.name from student s where s.id='」+sId+';実際、ほとんどのデータベースの読み取りはPreparedStatementで実現できます.
通常、SQL文ごとに構文解析->論理クエリー計画の生成->論理最適化->物理最適化などのステップで具体的な実行計画を生成し、PreparedStatementで実行計画を生成することができます.その後はパラメータ変更(実行計画の実行環境の変更に相当)だけで、前の4つのステップも省略され、効率が向上します.
概要
このPreparedStatementインタフェースは、Statementを継承し、2つの点で異なります.
PreparedStatementインスタンスには、コンパイルされたSQL文が含まれます.これが文を「準備」させることです.PreparedStatementオブジェクトに含まれるSQL文には、1つ以上のINパラメータがあります.INパラメータの値はSQL文作成時に指定されていません.逆に、この文はINパラメータごとに疑問符("?")を保持します.を選択します.各疑問符の値は、文が実行される前に、適切なsetXXXメソッドによって提供される必要があります.
PreparedStatementオブジェクトはプリコンパイルされているため、Statementオブジェクトよりも高速に実行されます.したがって、複数回実行されるSQL文は、常にPreparedStatementオブジェクトとして作成され、効率性が向上します.
Statementのサブクラスとして、PreparedStatementはStatementのすべての機能を継承します.さらに、INパラメータプレースホルダの代わりにデータベースに送信される値を設定する一連の方法も追加されました.同時に、3つのメソッドexecute、executeQuery、およびexecuteUpdateがパラメータを必要としないように変更されました.これらのメソッドのStatement形式(SQL文パラメータを受け入れる形式)は、PreparedStatementオブジェクトには使用できません.
1、PreparedStatementオブジェクトの作成
次のコードセグメント(conがConnectionオブジェクト)は、2つのINパラメータプレースホルダを持つSQL文を含むPreparedStatementオブジェクトを作成します.
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");

pstmtオブジェクトには「UPDATE table 4 SET m=?WHERE x=?」という文があります.DBMSに送信され、実行の準備ができています.
2、INパラメータを渡す
PreparedStatementオブジェクトを実行する前に、各オブジェクトを設定する必要がありますか?パラメータの値.これはsetXXXメソッドを呼び出すことによって達成することができ、ここでXXXはパラメータに対応するタイプである.たとえば、パラメータにJavaタイプlongがある場合、setLongが使用されます.setXXXメソッドの最初のパラメータは、設定するパラメータのシーケンス位置であり、2番目のパラメータは、そのパラメータに設定された値である.たとえば、次のコードでは、1番目のパラメータを123456789、2番目のパラメータを1000000に設定します.
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000); 

指定した文のパラメータ値が設定されると、clearParametersメソッドを呼び出してクリアするまで、文を複数回実行できます.接続のデフォルトモード(オートコミット有効)では、文が完了すると自動的にコミットまたはリストアされます.
基本データベースとドライバが文のコミット後も文のオープン状態を維持している場合は、同じPreparedStatementを複数回実行できます.この点が成立しない場合、Statementオブジェクトの代わりにPreparedStatementオブジェクトを使用してパフォーマンスを向上させようとするのは意味がありません.
pstmt(前に作成したPreparedStatementオブジェクト)では、2つのパラメータプレースホルダの値を設定してpstmtを10回実行する方法を示すコードがあります.このように、データベースはpstmtを閉じることができません.この例では、最初のパラメータは「Hi」に設定されています.定数に保つ.forループでは、2番目のパラメータは毎回0から9まで異なる値に設定されます.
pstmt.setString(1, "Hi"); 

SQL文が何度も実行される場合は、PreparedStatementオブジェクトを使用します.SQL文はプリコンパイルできます.「準備済み」文は、事前にコンパイルされたSQL文です.この方法は、Statementオブジェクトを使用して同じ文を複数回実行するよりも効率的です.また、PreparedStatementオブジェクトに含まれるSQL文には、1つ以上のINパラメータがある場合があります.Connection.prepareStatement()を使用して、PreparedStatementオブジェクトを作成します.
一括更新機能を使用すると、単一のPreparedStatementオブジェクトを複数の入力パラメータ値のセットに関連付けることができます.次に、この部品をデータベースに送信し、単一のエンティティとして処理できます.更新操作のセットを処理するのは、通常、更新操作を1回処理するよりも速いため、一括更新によりパフォーマンスが向上します.一括更新プログラムを使用するには、JDBC 2.0とJDK 1.2が必要です.
次の例では、PreparedStatementインタフェースの使用方法を示します.
                       // Connect to the AS/400.
     Connection c = DriverManager.getConnection("jdbc:as400://mySystem");

                       // Create the PreparedStatement
                       // object. It precompiles the
                       // specified SQL statement. The
                       // question marks indicate where
                       // parameters must be set before the
                       // statement is run.
     PreparedStatement ps = c.prepareStatement("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES (?, ?)");

                       // Set parameters and run the
                       // statement.
     ps.setString(1, "JOSH");
     ps.setInt(2, 789);
     ps.executeUpdate();

                       // Set parameters and run the
                       // statement again.
     ps.setString(1, "DAVE");
     ps.setInt(2, 456);
     ps.executeUpdate();

                       // Close PreparedStatement and the
                       // Connection.
     ps.close();
     c.close();