ステートメントの種類
最も単純なStatementインターフェイスについてはすでに説明しました。また、作業には非常に適していますが、複雑なクエリにはあまり適していません。一部の情報源では、 Statement を使用する必要はまったくなく、より複雑で機能が豊富なインターフェイスが代わりに適しているという意見が表明されています。
- 準備されたステートメント
- CallableStatement
かなり当然の疑問が生じます - なぜこれらのインターフェースが必要なのでしょうか? それを理解しましょう。
まず、 PreparedStatementインターフェイスとその他の JDBC 機能を見ていきます。CallableStatementインターフェイスについては後で説明します。第一に、その使用はそれほど一般的ではありません。第二に、それについてすべてを考慮した後、会話はすでにかなり短くなります。
また、PreparedStatement は、SQL インジェクションと呼ばれるデータベース ハッキングの一般的なアプローチに非常に役立ちます。
ただし、それについては少し後ほど説明します。
準備されたステートメント
PreparedStatementという名前を翻訳しようとすると、「準備されたステートメント」のようなものが得られます。ここで最も重要な言葉は「準備」です。「備え」とは何でしょうか?
この問題を検討する前に、非常に頻繁に起こる、利便性の観点からかなり重要な点を確認することを提案します。したがって、一部のアプリケーションでは、連絡先データを CONTACT テーブルに挿入する必要があります。これを行うには、次のようなクエリを準備する必要があります。
INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);
一見すると、すべてがそれほど難しくて怖いものではないように見えます。パラメータから必要な文字列 (名、姓、住所、電話番号) を収集するコードを記述する必要があります。すべての文字列データは単一引用符で囲む必要があることに注意してください。
これを別の関数で実行すると、次のような結果が得られます。
public String buildInsert(String firstName,, String lastName, String phone, String email) {
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) “+
”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
return sql;
}
名前、姓、電話番号、住所をフォームのパラメータ関数に渡し、それらから SQL クエリ文字列を作成します。引用により多少イメージが損なわれますが、今のところ怖くはありません。
さて、数字はどうでしょうか?引用符で囲む必要はありません。オパンキ、引用符が必要な場合もあれば、不要な場合もあります。状況はさらに複雑になってきています。
ここで、もう 1 つ問題を追加しましょう。文字列内に通常の引用符が (1 つも含まれていない) 場合はどうなるでしょうか。まずそのような引用符を探して処理する必要があります。ムダァ。どういうわけか私たちは不快に感じ始めます。
ここで日付処理を追加すると、タスクは完全に退屈なものになり、膨大な量の作業を行う必要があります。日付は一般に不快なものです。SQL サーバーごとに受け入れられる日付の形式も異なります。
それで、何が見えるでしょうか?クエリ内でパラメータを使用する必要がある場合、手動でクエリを構築するのは非常に面倒になります。不快なだけではなく、退屈だとさえ言えます。考慮すべきケースは膨大にあり、非常に退屈な作業です。基本的に、 PreparedStatementインターフェイスはそのような場合のために提案されました。
このリクエストにより、次の 2 つのことが可能になります。
- パラメータを置換する箇所を指定したリクエストを事前に準備してください
- 特定のタイプのパラメータを設定し、すでに設定されているパラメータを使用してクエリを実行します。
PreparedStatement の例
パラメーターを設定するオプションのPreparedStatementの構造は次のようになります。
// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";
// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";
// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);
// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);
// Execute the request
stmt.executeUpdate();
ご覧のとおり、すべては非常にシンプルです。
まず、SQL クエリを記述するとき、パラメータを置換する必要がある場所は疑問符 (?) で記述されます。
次に、 con.prepareStatement()を呼び出してリクエストを作成します。
第三に、パラメータの設定は、数値と値の指示を経て行われます。パラメーターの数は、配列やコレクションを操作するときに慣れているように 0 からではなく、1 から始まることに注意してください。
PreparedStatementインターフェイスには、文字列を設定するメソッドsetString()、数値を設定するメソッド setInt()、setLong()、setDouble()、日付を設定するメソッド setDate()が含まれています。さらに複雑な型 - これはドキュメントで確認できます。
4 番目に、 stmt.executeUpdate()の呼び出しはクエリ文字列を指定せずにすでに実行されています。
PreparedStatementと友達になることを強くお勧めします。これは非常に効果的なツールです。
GO TO FULL VERSION