> var SQL の PreparedStatement を作成し、SQL2 内にネストする必要がありますか?
いいえ
>または、ネストなしで SQL2 に基づく複数の PreparedStatement が存在する必要があります
はい
さらに:クエリごとに1つの文字列を作成できれば、より良いでしょう。SQL とコードを混在させるのはあまり好きではありません。デバッグと理解が難しくなり、簡単にテストするために SQL ツールにコピー/貼り付けすることはできません。コードから SQL を分離することで、クエリを操作 (実際の fetch ) から分離し、保守が容易になります。さらに、コードがあなたのものでない場合は、理解がはるかに簡単になります。
文字列を繰り返しているように見えても問題ありません。ポイントは、ステートメントをできるだけ単純化することです。
私はこのようなことをします:
final class DatabaseQueries {
public final static String SOME_SCENARIO = "SELECT z WHERE x > y JOIN A, B ";
public final static String SOME_OTHER_SCENARIO = "SELECT z WHERE x <= y JOIN A, B";
}
そして、あなたのクラスからそれを使用します:
PreparedStatement pstmt = getCon().prepareStatement( getQuery() );
private String getQuery() {
if( x != null ) {
return DatabaseQueries.SOME_SCENARIO;
} else {
return DatabaseQueries.SOME_OTHER_SCENARIO;
}
}
クラス「DatabaseQueries」を作成しているときに、多くの文字列を繰り返していることがわかります。一部の部分を他の定数に置き換えても問題ないと思います。
final class DataBaseQueries {
// this one is private
private final static String JOIN_A_B = " join A, B ";
public final static String SOME_SCENARIO = "SELECT z WHERE x > y " + JOIN_A_B ;
public final static String SOME_OTHER_SCENARIO = "SELECT z WHERE x <= y " + JOIN_A_B ;
}
ここでのポイントは、物事を単純化することです。これが最初のステップです。2 番目のステップでは、非常に複雑なクエリを作成するためのクラスを作成できますが、おそらく YAGNI.
クエリが多すぎる場合は、この 質問のように ResourceBundle からロードするように置き換えることができます
これが役立つことを願っています。