JavaのStatement、PreparedStatement、PreparedStatement+バッチの違い

7853 ワード

まず、データベースに接続した後に実行されるsql文について説明します.通常、データベースに接続した後、statementクラスのオブジェクトまたは彼のサブクラスのオブジェクト(PreparedStatementクラス)を取得します.このオブジェクトを使用して、データベースを操作することができます.
Statementは、sql文を実行するための3つの方法を提供します.
1,execute:任意のsql文で実行できますが、面倒です.通常は選択しませんが、SQL文のタイプが不明な場合はexecuteを使用してsql文を実行するしかありません.
2,executeUpdata:主にDMLとDDL文を実行するために使用され、DML文を実行するとSQL文の影響を受けた行数が返され、DDL文を実行すると0が返されます.
3,executeQuery:クエリー文のみ実行できます.実行すると、クエリの結果を表すResultSetという集合オブジェクトが返されます.
次に、重要な内容を説明します.
StatementとPreparedStatementのオブジェクトはsql文を実行するために使用できますが、多くの点で使用されているPreparedStatementクラスのオブジェクトは比較的多く、PreparedStatementはStatementのサブクラスであり、sql文をプリコンパイルすることができ、プリコンパイルされたsql文はPreparedStatementオブジェクトに格納されます.次に、PreparedStatementオブジェクトを使用して、sql文を複数回効率的に実行します.
PreparedStatementクラスを使用するオブジェクトにも、上記の3つのsql文を実行する方法がありますが、この3つの方法にはパラメータは必要ありません.具体的なプロセスの比較については、http://www.cnblogs.com/duhuo/p/4276226.htmlを参照してください.
具体的には以下の通りです.
1.Statementオブジェクトの使用
使用範囲:類似SQL(構造が同じ、具体的な値が異なる)文を実行する回数が少ない
長所:文法が簡単
欠点:ハードコーディングの採用効率が低く、安全性が悪い.
原理:ハードコーディング、実行するたびに類似SQLがコンパイルされる 
サンプル実行プロセス:
 public void exec(Connection conn){

        try {

                Long beginTime = System.currentTimeMillis();

                conn.setAutoCommit(false);//      

                Statement st = conn.createStatement();

                for(int i=0;i<10000;i++){

                   String sql="insert into t1(id) values ("+i+")";

                   st.executeUpdate(sql);

                }

                Long endTime = System.currentTimeMillis();

                System.out.println("Statement  :"+(endTime-beginTime)/1000+" ");//    

                st.close();

               conn.close();

        } catch (SQLException e) {             

                  e.printStackTrace();

        }

   }

実行時間:Statement時間:31秒
2.プレコンパイルPreparedStatement
使用範囲:類似のsql文を実行する回数が比較的多い(例えばユーザーがログインして、表に対して頻繁に操作する..)文と同じで、具体的な値が異なるだけで、動的SQLと呼ばれます
利点:文は1回のみコンパイルされ、コンパイル回数が減少します.セキュリティの向上(SQL注入を阻止)
欠点:類似していないSQL文を実行すると、速度が遅くなります.
原理:類似SQLは一回だけコンパイルして、コンパイル回数を減らします
事例実行プロセス:
 public void exec2(Connection conn){

         try {

                Long beginTime = System.currentTimeMillis();

                conn.setAutoCommit(false);//    

                PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");

                for(int i=0;i<10000;i++){

                       pst.setInt(1, i);

                       pst.execute();   

                }

                conn.commit();

                Long endTime = System.currentTimeMillis();

                System.out.println("Pst  :"+(endTime-beginTime)+" ");//    

                pst.close();

                conn.close();

         } catch (SQLException e) {               

                  e.printStackTrace();

         }

    }

実行時間:Pst時間:14秒
3.PreparedStatement+バッチの使用
使用範囲:データベース・テーブルの複数レコードを一度に更新する必要がある
利点:SQLエンジンとのインタラクション回数を減らし、再び効率を高め、類似文は一度だけコンパイルし、コンパイル回数を減らす.セキュリティの向上(SQL注入を阻止)
欠点:
原理:バッチ:SQLエンジンとのインタラクションの回数を減らし、一度にSQLエンジンに複数のSQLを渡す.
名詞の解釈:
PL/SQLエンジン:oracleでpl/sqlコードを実行するエンジンで、実行中に標準のsqlがsqlエンジンに渡されて処理されることがわかります.
SQLエンジン:標準sqlのエンジンを実行します.
事例実行プロセス:
public void exec3(Connection conn){

     try {

           conn.setAutoCommit(false);

           Long beginTime = System.currentTimeMillis();

           PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");

                     

          for(int i=1;i<=10000;i++){   

                pst.setInt(1, i);

                pst.addBatch();//

                if(i%1000==0){//         ; 50,100,500,1000  

                      pst.executeBatch();

                      conn.commit();

                      pst.clearBatch();

                }//end of if

           }//end of for

           pst.executeBatch();

           Long endTime = System.currentTimeMillis();

           System.out.println("pst+batch  :"+(endTime-beginTime)+"  ");

           pst.close();

           conn.close();

      } catch (SQLException e) {

            e.printStackTrace();

      }

}

実行時間:pst+batch時間:485ミリ秒
全体的に見ると:
PreparedStatementはStatementを使用するよりも次の3つのメリットがあります.
1、PreparedStatementはsql文を事前にコンパイルする.パフォーマンスが向上します.
2、PreparedStatementは「つなぎ合わせる」sql文を必要とせず、コンパイルが簡単です.
3、PreparedStatementはSQL注入を防止でき、安全性が良い.