5

これは非常にオープンな質問ですが、SQLの可読性にとって非常に有益であると思います。

つまり、Javaプログラムがあり、そこから多くのサブクエリと結合を使用してモンスターSQLステートメントを呼び出そうとしています。私の質問の出発点は、次のような文字列定数です。

static string MONSTER_STATEMENT = 
  "SELECT  " +
  "   fields" +
  "WHERE "+
  "   fieldA = (SELECT a FROM TableC) " +
  "AND fieldB IN (%s)" +
  "AND fieldC = %d " +
  "FROM "
  "   tableA INNER JOIN tableB ON ...";

後でString.formatを使用して入力され、実行されます。

この種のものを読みやすくするための秘訣は何ですか?内部結合を分離しますか?文字列内でSQL自体をインデントしますか?コメントはどこに置きますか?あなたの兵器庫にあるすべてのトリックを共有してください。

4

3 に答える 3

1

私の傾向は、Management Studio のような管理コンソールを使用してデータベースに対して直接クエリを実行した場合と同じように、SQL ステートメントをフォーマットすることです。したがって、SQL ステートメントを作成するときは、スペースと改行を入れるのに時間がかかります。消費される追加のスペースは、SQL プロファイラーを使用して印刷またはキャプチャした場合に SQL を読み取ることができる時間の節約と比較して取るに足らないものです。StringBuilderしたがって、次のように SQL を組み立てるのに使用する傾向があります。

StringBuilder sql = new StringBuilder();
sql.append("Select ....");
sql.append("\t\n, AdditionalCol, ...");
sql.append("\nFrom ...");
sql.append("\n  Inner Join ...");
sql.append("\n      On ColA =  ...");
sql.append("\nWhere Col1 = (");
sql.append("\n          Select a");
sql.append("\n          From TableC");
sql.append("\n          ");
sql.append("\n  And ColB In(%s)");
sql.append("\n  And ColC = %d");
于 2010-05-05T16:55:13.817 に答える
1

ビルド プロセスをラップするヘルパー クラスが役立つ場合があります。それは 1 つかもしれません: http://openhms.sourceforge.net/sqlbuilder/

とにかく、常に準備済みステートメントを使用してください。

于 2010-05-05T17:11:21.400 に答える
0

String.formatこのような複雑な SQL は、 SQL インジェクションの問題を回避するために、 によってまとめられるのではなく、準備されたステートメント内にある必要があります。

呼び出し可能なステートメントでラップするか、構成/xml ファイルに配置します。Java ソース ファイルは、複雑な SQL には適していません。

そうは言っても、IDEAにはJavaの文字列を別の言語のようにフォーマットする言語フォーマット機能があります(渡されるメソッドまたは注釈に基づいて)。

編集:あなたのシナリオを考えると、呼び出し可能なステートメントが機能しない可能性があることに同意します。アポストロフィを含むパラメーターがすべてを爆破する可能性があるという理由だけで (たとえ攻撃者がいなくても)、内部開発であっても、プリペアド ステートメントは依然として価値があります。パラメータとして渡すことができない部分(例のような一時テーブル名など)のコードでのみ動的に(String.formatまたはその他のもの)、それを残りの適切なパラメータを渡す準備済みステートメントとして使用します。

見苦しくないようにするために、構成/xmlタイプのファイルが私が求めているもののようです。

于 2010-05-05T16:44:41.503 に答える