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がコンパイルされる
サンプル実行プロセス:
実行時間:Statement時間:31秒
2.プレコンパイルPreparedStatement
使用範囲:類似のsql文を実行する回数が比較的多い(例えばユーザーがログインして、表に対して頻繁に操作する..)文と同じで、具体的な値が異なるだけで、動的SQLと呼ばれます
利点:文は1回のみコンパイルされ、コンパイル回数が減少します.セキュリティの向上(SQL注入を阻止)
欠点:類似していないSQL文を実行すると、速度が遅くなります.
原理:類似SQLは一回だけコンパイルして、コンパイル回数を減らします
事例実行プロセス:
実行時間:Pst時間:14秒
3.PreparedStatement+バッチの使用
使用範囲:データベース・テーブルの複数レコードを一度に更新する必要がある
利点:SQLエンジンとのインタラクション回数を減らし、再び効率を高め、類似文は一度だけコンパイルし、コンパイル回数を減らす.セキュリティの向上(SQL注入を阻止)
欠点:
原理:バッチ:SQLエンジンとのインタラクションの回数を減らし、一度にSQLエンジンに複数のSQLを渡す.
名詞の解釈:
PL/SQLエンジン:oracleでpl/sqlコードを実行するエンジンで、実行中に標準のsqlがsqlエンジンに渡されて処理されることがわかります.
SQLエンジン:標準sqlのエンジンを実行します.
事例実行プロセス:
実行時間:pst+batch時間:485ミリ秒
全体的に見ると:
PreparedStatementはStatementを使用するよりも次の3つのメリットがあります.
1、PreparedStatementはsql文を事前にコンパイルする.パフォーマンスが向上します.
2、PreparedStatementは「つなぎ合わせる」sql文を必要とせず、コンパイルが簡単です.
3、PreparedStatementはSQL注入を防止でき、安全性が良い.
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注入を防止でき、安全性が良い.