6

明確にするために:PreparedStatement私は、ループの外側を作成することが正しいことであることを知っています。私は好奇心からこの質問をしました。


PreparedStatement常に同じSQLクエリを使用してループ内を作成していると仮定します。

final String sql = "INSERT INTO ...";
while (condition) {
   ...
   PreparedStatement statement = connection.prepareStatement(sql);
   // Fill values of the prepared statement
   // Execute statement
   ...
}

PreparedStatementオブジェクトは常に新しく作成されるので、これは役に立ちませんか?または、基盤となるデータベースは、それが作成されたのと常に同じSQLクエリであることを認識し、それPreparedStatementを再利用しますか?

4

5 に答える 5

8

1.ループ全体で同じ ものを使用している場合は、ループの外側を維持することをお勧めします。PreparedStatement PreparedStatement

2.ループ内で変化し続けるSQLステートメントがある場合は、ループ内でそれを使用するだけの価値があります。

3.さらに、変更を続ける場合は、Statement の代わりに PreparedStatement使用します。そうしないと、変更を続けると、PreparedStatementの目的そのものが失われます。

于 2012-08-15T14:58:30.193 に答える
4

一部のドライバーは、プリペアドステートメントをキャッシュします。たとえば、次のOracleドキュメントをざっと読んでください:http: //docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

確かに多くのJDBCドライバーの機能のように思われますが、これがすべてのドライバーに当てはまる必要があるものはないと思います。MySQLはこれを行わない可能性があるようです: MySQLプリペアドステートメントキャッシングを使用するにはどうすればよいですか?

とはいえ、プリペアドステートメントを本当に効率的に使用したい場合は、各ループの反復で使用するプリペアドステートメントのインスタンスにぶら下がる方がはるかに理にかなっているようです。

于 2012-08-15T15:00:52.750 に答える
2

これまでのところ、私が知っている2つの方法。

第一の方法

その挿入記録を1つずつ

final String sql = "INSERT INTO tablename(columnname) Values(?)";

PreparedStatement statement = connection.prepareStatement(sql);

while (condition) {
statement.setString(1,value);
statement.executeUpdate();
}

(また)

2番目の方法

すべてのレコードを一括挿入として挿入します

final String sql = "INSERT INTO tablename(columnname) Values(?)";

PreparedStatement statement = connection.prepareStatement(sql);

while (condition) {
statement.setString(1,value);
statement.addBatch();
}

statement.executeBatch();
于 2013-01-04T09:27:47.670 に答える
1

また、 Connection.setAutoCommit(false)を使用して自動コミットを無効にし、 PreparedStatement.executeBatch()を使用してみてください。

于 2012-08-15T15:02:52.860 に答える
1

毎回作成しても意味がありません。リンクhttp://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how-to-use-them-properlyを参照してください

于 2012-08-15T15:00:30.550 に答える