。どうして?
私が知っているように、PreparedStatementはSQL文のプリコンパイルに時間を費やします。 StatementがPreparedStatementより速くなることが分かります。または私は間違っている?これは速いですか?</p> <pre><code>private static final String SQL = "SELECT * FROM table_name"; .... </code></pre> <p>をして、このSQLクエリのPreparedStatementを使用している:StatementまたはPreparedStatementの
答えて
などです。同じステートメントを複数回、異なるデータで実行する必要がある場合は、準備済みステートメントの方がはるかに高速です。 SQLはクエリを一度しか検証しないため、文を使用すると、そのたびにクエリが検証されます。
PreparedStatementsを使用するもう1つの利点は、SQLインジェクションの脆弱性を回避することです。あなたのケースではクエリがそれほど簡単ではありません。
準備された文の実行と文の実行の違いは、おそらくごくわずかです。
EDIT:下記のコメントに応じて、DAOクラスをよく調べて、何をしているのかを確認する必要があります。たとえば、メソッドが呼び出されるたびにプリペアドステートメントを再作成すると、プリペアドステートメントを使用するメリットが失われます。
達成したいのは、永続性レイヤーをカプセル化して、MySQLやPostgresなどの特定の呼び出しを使用しないようにすることです。同時に、次のようなパフォーマンスやセキュリティの利点を活用します。準備されたステートメント。これを行うには、PreparedStatementなどのJava自身のオブジェクトに依存する必要があります。
私は個人的には、Hibernateの下でCRUD操作を行うための独自のDAOクラスを構築し、Java Persistence APIを使用してすべてをカプセル化し、セキュリティ上の利点については準備済みのステートメントを使用する必要があります。反復操作を行うための具体的なユースケースがある場合は、そのオブジェクト内でラップする傾向があります。
Hibernateは、XMLファイル経由で使用しているデータベースベンダーを使用するように設定することができます。したがって、パーシスタンスレイヤのカプセル化は本当にすっきりしています。しかし、それは正しくなるにはかなり複雑な製品です!
ほとんどの場合、クエリはあなたの例ほど単純ではありません。クエリにバリエーションがある場合、つまりコンパイル時に知られていないパラメータは、PreparedStatementを使用してSQLインジェクションの脆弱性を回避する必要があります。これはパフォーマンス上の問題に優先します。 PreparedStatementとStatementとの間に相違がある場合、問題の特定のJDBCドライバに大きく依存します。ほとんどの場合、データベースにアクセスして実際のクエリを実行して結果を取得するコストと比較して、ペナルティは無視できる程度です。
はい、あなたは明白なことを言う。しかし、このクエリでは、パラメータを設定する必要はなく、それに基づいてSQLインジェクションは行いません。 – Ifozest
だから、パラメータがなくても一度だけ実行すると、PreparedStatementの代わりにStatementを実行する方が少し速いかもしれないが、PreparedStatementを常に使用しています。 –
ここでの検討は、高速ではありません。 SQLの解析は、一般的に全体的な実行の小さな部分になります。詳細はWhen should we use a PreparedStatement instead of a Statement?
私の知る通りPreparedStatementは非常に高速です。ここでなぜpreparedstatementが速いのか何らかの理由でステートメントを読んでください。
JDBC APIは、データベースとの接続機能を提供します。次に、ステートメントとpreparedstatementを使用してクエリを実行しようとします。
クエリを実行するステップは4つあります。
SQLクエリの解析。
このクエリをコンパイルします。
データ取得パスの最適化。
クエリを実行します。
ステートメントインターフェイスは、クエリを複数回実行する必要がない場合に適しています。
Statement Interfaceの短所。 ハッカーは簡単にデータをハックすることができます。私たちはユーザー名とパスワードを持っている1つのクエリを持っていると仮定すると、あなたは適切なパラメータを与えることができるパラメータですusername = '[email protected]'とパスワード= 'abc123'実際にはこれは現在しかし、ハッカーはusername = 'abc @ example.com 'または' 1 '= 1およびpassword =' 'を指定すると、正常にログに記録できます。これはステートメントで可能になっています。
そして、sqlはデータベースからデータを取得するたびに検証します。
Javaには、上記のPreparedStatementという問題の解決策があります。 このインターフェイスには多くの利点があります。 preparedstatementの主な利点は、SQLは毎回クエリを検証しないということです。結果を迅速に得ることができます。以下の準備文の利点をお読みください。
1)クエリのパラメータの値をsetterメソッドで安全に指定できます。 2)自動的に特殊文字をエスケープするため、SQLインジェクションを防止します。 3)上記のステートメントを使用すると、毎回4つのステップが実行されますが、PreparedStatementを使用するときは最後のステップのみが実行されるので、これはより高速です。
- 1. 私は、それはperlの</p> <p>私がいたを使用して行うことができますどのように</p> <pre><code>String sql = Query1; </code></pre> <p>のようにそれを交換したい行</p> <pre><code>String sql="select * from "+ "emp_data"; </code></pre> <p>のように私が持っている私のファイルでのPerl
- 2. MS SQLサーバー:<code>NULL</code>値のためのゼロを表示する</p> <pre><code>select COALESCE(my_integer_field, '') from my_table </code></pre> <p>:私はこれを使用することができる午前
- 3. org.hibernate.hql.internal.ast.QuerySyntaxException:<table_name>がここ
- 4. は、私はSQLが<code>LINQ</code>によって生成されているものを見たいとき、私は例</p> <pre><code>var query = (from a in this.Context.Apples select a.Name).ToList(); </code></pre> <p>のためのSQLステートメントにLINQを使用している場合LINQは
- 5. Laravel Eloquentクエリ(またはクエリビルダを使用)でテーブルのエイリアスを作成する方法は?</p> <pre><code>$users = DB::table('really_long_table_name') ->select('really_long_table_name.id') ->get(); </code></pre> <p>私はこのSQLと同等を探しています:
- 6. これはThread.MemoryBarrier()の正しい使用ですか?</p> <pre><code>private static bool shouldRun = true; </code></pre> <p>そして、私のようなコードがあるスレッドの実行、持っている:
- 7. は、私は、クエリは、私はどのように行う、私はSQL Serverに接続して、このクエリを実行するために<code>C#</code>を使用していますが、私の問題がある</p> <pre><code>Select Count(numstudents) from classA </code></pre> <p>でカウントを返しますSQLクエリを実行していたDataTable
- 8. それは私が疑問に思って何を結果として<code>6</code></p> <p>を返し、</p> <pre><code>SELECT `generateoffset` FROM `opa`.`sddrecurrencetype` WHERE `sddrecurrencetypeid`=1; </code></pre> <p>を私はSQLサブクエリを持っているSQLクエリが
- 9. 私は<code>R</code><code>sqldf</code>パッケージの<code>dbWriteTable</code>機能を使用して作成<code>SQL</code>データベースに保存された<code>data.frame</code>を持つSQLデータベース
- 10. プロパティはどのようにカプセル化を提供しますか? 、代わりにフィールド_specialStringを使用しての、ここで</p> <pre><code>class SitePage { private string _specialString; public string SpecialString { get { return _specialString; } set { _specialString = value; } }} </code></pre> <p>:
- 11. hbm.xmlにマップされたプロパティを一時的にすることはできますか?私が今までのクライアントに<code>hashedPassword</code>を転送したくないので、私はそれが過渡作る</p> <pre><code>class User { private String login; transient private String hashedPassword; } </code></pre> <p>:
- 12. JPA - 3つのテーブルを結合します。 1つはPKです。これは、複合PK <code>customer_id</code>と<code>company_id</code><br></p> <p><strong>データ</strong><br> ...のIDを持っている</p> <p><strong>カスタマー</strong><br> ::他の二つのそれぞれが、私は3つのエンティティを持ってPK
- 13. ダイナミックオブジェクトは、これは、この中</strong></p> <pre><code>IResultSEt rs = db.SELECT.COLUMNS(db.GetTable(data.ToString()).ColumnNames).FROM(data.ToString()).Execute(); </code></pre> <p>、動作しない作品</p> <p><strong>
- 14. 私は</p> <p><code>id,first_name,last_name,phone,gender,user_type</code></p> <p>のこれらの列が含まれている「<code>users</code>」と呼ばれるテーブルを持つクエリからSQL
- 15. Freemarkerの:</p> <pre><code>public class Adress { private String _street; private String _city; } </code></pre> <p>と別のJava:私はJavaオブジェクトを持って</p>例えば <p>FreeMarkerの言語と他のオブジェクトが含まれているオブジェクトのリストを印刷したい他のオブジェクト
- 16. エンティティは、まだ私は春データのNeo4j 4で作業すると、次のユーザエンティティのNeo4j GraphRepositoryを使用して</p> <pre><code>@NodeEntity public class User{ private Long id; private String username; //Getter, Setter } </code></pre> <p>を持ってる
- 17. のArrayListのカスタムは、私は、これらのオブジェクトのいくつかのオブジェクト</p> <pre><code>class A { private Long id; private String name; public boolean equals(Long v) { return this.id.equals(v); } } </code></pre> <p>とのArrayListを持っている方法
- 18. Heredoc <<<または<<?
- 19. は、私はRDDが</p> <pre><code>JavaPairRDD<String, List<String>> existingRDD; </code></pre> <p>と呼ばれてい
- 20. SQL - 私は<strong>SQLコンパクト</strong></p> <p>それは基本的にこれらのクエリであるため、クエリを作成しようとしていますが、私は私は1つにそれらを組み合わせることができ期待していたこのクエリ
- 21. アンドロイドrxJavaエラー私はこれを使用する代わりに</p> <pre><code>Observable.create(new Observable.OnSubscribeFunc<T>() {...}); </code></pre> <p>の新しいRXのJavaを使用しています改造
- 22. Angularjs:私は3 <code><select></select></code>を構築したい。このことから</p> <pre><code>$scope.myArr = ["a_b_c","a_b_d","a_e_g","f_t_r","f_t_g","f_u_m"]; </code></pre> <p>:リスト
- 23. Tortoise svn <<<<をファイルに追加しています!
- 24. SQLは、私が<strong>サブグループこの単純な<code>xy_table</code>の</strong>に<code>y</code>の<strong><a href="http://en.wikipedia.org/wiki/Median" rel="nofollow noreferrer">Median</a></strong>を計算したいサブグループで
- 25. オブジェクトは、私は自分のアプリケーションで<code>infragistics</code><code>igGrid</code>を使用しているが、私は</p> </blockquote>「_super」プロパティまたはメソッドをサポートしていません<code>javascript</code>エラー</p> <blockquote> <p>オブジェクトを取得しています<p>igGrid
- 26. PHP:それは私を含むファイルの先頭に参照された</p> <pre><code>public static function find_all() { return self::find_by_sql("SELECT * FROM ".self::$table_name); } </code></pre> <p>:私のボタンが正しくforeachループ
- 27. null可能なdatetimeから日付を取得していますか?</p> <pre><code>q = q.AsQueryable() .Where(c => c.CallNextDate.Date < DateTime.Now.Date) .ToList(); </code></pre> <p>しかし<code>c.CallNextDate.Date</code>は使用できません。私はこのように、このLINQを使用しています後ろ
- 28. は、どのように私は<code>string</code>あるこの</p> <pre><code>var alldest = cc.returnallfullDestinations(mainElement).Split('|'); </code></pre> <p><code>returnallfullDestionations</code>のようなデータを取得していますC#
- 29. HTTPGETCLOBはSYSIBM.SYSDUMMY1</p> <p>FROM</p> <p>SELECT systools.HTTPGETCLOB( '<a href="http://www.ibm.com" rel="nofollow">http://www.ibm.com</a>'、 '')エラーリモートホストが、私はSQL(Iシリーズ)から、以下のクエリを実行しようとしています
- 30. 私はMySQLのテーブルは、これはフィールド <code>Place_id</code>、<code>PlaceName</code>、<code>Place_LATITUDE</code>、<code>place_LONGITUDE</code>が含まれている<code>tbl_places</code> を命名した緯度と経度
私は何かを明確にしたいと思います。私の簡単なwebAppにはDAOクラスがあります。このクラスでは、prepareStatementを使うメソッド(IDで情報を取得する)があります。このメソッドを複数回呼び出す場合、preparedStatementがこのSQLクエリをプリコンパイルする回数は何回ですか? – Ifozest
私はこのために私の主な答えを編集しました - それはあなたの質問の興味深い部分です。 – christophmccann
編集を参照してください。詳細な回答をいただきありがとうございます。 – christophmccann