ホームページ >Java >&#&チュートリアル >Java プログラマーが犯す可能性のある 3 つのよくある SQL の間違い
Java プログラマーの毎週の仕事は、スケーラブルな Web アプリケーションのコーディングと開発、動的な Web サイトの作成、効率的な電子商取引の商品ページの開発、あるいは Android アプリケーションの開発などであることがわかります。しかし、たとえ彼らが異なるプロジェクトに取り組んでいたとしても、多くの場合共通点は 1 つあります。それはプログラミングです。
彼らの職業は、より多くのプログラミング知識を蓄積するために長時間の作業を必要とします。 Java プログラマーは、プロジェクトの要件を理解し、独自のプロトタイプ プロジェクトを設計および開発する必要もあります。業界の変化に対応するには、HTML、SQL などの他の言語の基本的な知識も必要です。
Java プログラマーのキャリアは順風満帆ではなく、あらゆる挑戦をしなければなりません。どんなに優秀なプログラマーであっても、プログラミングの過程で避けられないミスは避けられません。たとえば、SQL ステートメントを作成する場合、いくつかの間違いは絶対に避けられます。ここでは、エディターはプログラマー向けの一般的な SQL エラーをいくつかリストします。
SELECT TOP 3 common_mistakes FROM SQLProgrammingMistakes;
上記のクエリの結果は次のとおりです:
1. バッチ更新を使用しないでください
SQL ステートメントを作成するときに、Java プログラマが最もよくある最大の間違いの 1 つは、バッチ処理を忘れることです。テーブルに何千もの INSERT ステートメントを記述することは、実際には得策ではありません。プログラマーは、単一の SQL 言語を使用して、さまざまなパラメーターをバインドするバッチ INSERT ステートメントを作成する必要があります。バッチを実行すると、単一の実行よりもはるかに高速になります。
次の例を見てみましょう:
String [] queries = { "INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('1', 'Allen', 'abc', 'Sales')", "INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('2', 'Max', '102', 'Marketing')", "INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('3', 'Ward', 'xyz', 'Sales')", "INSERT INTO Employee { Eno, Ename, Ecode, EDept} values ('4', 'Sam', '55', 'Marketing')", }; Connection connection = new getConnection(); Statement statement = connection.createStatement(); for (String query : queries ) { statement.execute(query); } statement.close(); connection.close();
これは、データベース内の各 INSERT ステートメントを個別に実行する必要がある悪いコードです。 INSERT ステートメントのバッチを一度にデータベースに送信します:
import java.sql.Connection; import java.sql.Statement; //… Connection connection = new getConnection(); Statement statement = connection.createStatement(); For (Employee employee: employees){ String query = "INSERT INTO Employee (Eno, Ename, Ecode, Edept) values (' " + Employee. getEno() + "', '" + Employee.getEname() +"', '" + Employee.getEcode() + "', '" + Employee.getEdept() + "')"; statement.addBatch(query); } statement. executeBatch(); statement.close(); connection.close();
大規模なデータ セットを挿入する場合、バッチ処理は非常に重要です。パフォーマンスを大幅に向上させるには、プログラマはバッチ モードでステートメントを実行してみる必要があります。一括挿入を実行するもう 1 つの方法は、PreparedStatement オブジェクトを使用することです。ただし、バッチ処理は INSERT ステートメントに限定されず、更新、削除、ステートメントなどの操作の実行にも使用できます。
2. DBMSエンジンはクエリを最適化しません
すべてのJavaプログラマがSQLを理解しているわけではありません。 SQL クエリで同じ結果を得る方法はたくさんありますが、プログラマは常に最も高速で応答性の高い方法に従う必要があります。
たとえば、Java プログラマは、名前が 'A' で始まるすべての従業員を Employee テーブルから取得するように求められます。通常、従業員の名前の最初の文字を返すには LEFT 関数を使用します:
SELECT Ename FROM Employee WHERE LEFT (Ename,1) = ‘A’;
しかし、これは次のようになります。正しくない。上記のクエリでは、データベース システムはテーブル全体をスキャンして必要な情報を見つけます。インデックスが使用されないため、クエリの実行に多くの時間がかかります。代わりに、プログラマはクエリを使用して結果を取得する必要があります:
SELECT Ename FROM Employee WHERE Ename LIKE ‘A%’;
上記のクエリは、指数を利用してデータを迅速かつ効率的に取得します。したがって、一般に、DBMS エンジンがインデックスを取得できる場合、プログラマは検索に最適化された用語を使用してクエリの実行を高速化するように努めるべきです。
3. 述語演算の間違った順序
多くの Java プログラマは、クエリの通常の処理順序は次のとおりであると信じています: FROM、WHERE、GROUP BY、HAVING、SELECT。上記のシーケンス列は、クエリの実行に使用される論理順序に追加されるものです。論理的に言えば、FROM 句が最初に処理され、ソース データ テーブルで取得されたデータが定義され、その後に WHERE、GROUP BY などが続きます。ただし、物理的に言えば、クエリ処理は異なります。述語が評価される順序は、さまざまなルールやデータベースのバージョンによって変更されることがよくあります。
たとえば、次の Employee テーブル:
上記のテーブルで、従業員コードが 100 より大きい営業部門の従業員をすべて取得したいとします。通常、この場合、プログラマは次の方法でテーブルをクエリします:
SELECT Eno, Ecode AS Employee_No,Employee_Code FROM Employee WHERE Edept LIKE 'M%' AND CAST (Ecode AS INT) > 100;
ただし、上記のクエリはエラーになります:
「varchar 値 'abc' をデータ型 int に変換するときに変換に失敗しました」
クエリ失敗しました。理由は前に指摘したとおりで、述語の実行順序が指定されていません。この場合、2 番目の述語評価が最初に変換エラーを引き起こします。
相反使用CASE表达式,这里将保证只有合法的数值将被转换为int类型:
SELECT Eno, Ecode AS Employee_No,Employee_Code FROM Employee WHERE Edept LIKE 'M%' AND CASE WHEN Ecode NOT LIKE '%[^0-9]%' THEN CAST (Ecode AS INT) END>100;