私が理解しているように、ステートメントオブジェクトは、優れたアプリケーションにはあらゆる種類の問題があるため、エンタープライズアプリケーションの開発には使用されません。新しいバージョンでまだ廃止されていないのはなぜですか?
4 に答える
Statement
完全に優れたインターフェイスです。悪いのは、文字列、特にユーザー入力を含む文字列を連結してクエリを作成することです。変数を含まない定数クエリのみを発行する場合は、シンプルなStatement
インターフェイスが最適です。
声明
データベースへの汎用アクセスに使用します。実行時に静的 SQL ステートメントを使用している場合に役立ちます。Statement インターフェイスはパラメーターを受け入れることができません。
JDBC でのステートメントの使用は、BIND 変数を受け入れることができない唯一のステートメント タイプであるため、DDL (ALTER、CREATE、GRANT など) に使用されるように 100% ローカライズする必要があります。
準備済みステートメント
SQL ステートメントを何度も使用する予定がある場合に使用します。PreparedStatement インターフェースは、実行時に入力パラメーターを受け入れます。
PreparedStatements または CallableStatements は、その他すべてのタイプのステートメント (DML、クエリ) に使用する必要があります。これらは、バインド変数を受け入れるステートメント タイプであるためです。
JDBC ドライバーは、SQL ステートメントを異なる方法で処理できます。具体的には、Oracle では、PreparedStatement は、:NAME のように見えるすべてのものをバインドしたいと考えています。
これは、:NEW および :OLD の名前を使用して新しい行と古い行を表す Oracle トリガーにとって問題です。
そのため、PreparedStatement を使用して Oracle トリガーを作成しようとすると、:NEW / :OLD の参照に何もバインドされていないため失敗します。
代わりに、通常の Statement.execute() 呼び出しを使用してこれを行う必要があります。
また、PreparedStatement は Statement よりも安全です。
Statement を使用していて、ユーザーからの入力を取得してクエリに直接渡す場合は注意してください。
ユーザーは、SQL インジェクションを使用してシステムをハッキングできます。