>我应该为 var SQL 创建一个 PreparedStatement 并将其嵌套在 SQL2 中吗
不
> 还是应该有多个基于SQL2的PreparedStatement没有嵌套
是的
此外:如果您可以为每个查询创建一个字符串,那就更好了。我不太喜欢将 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 ;
}
这里的重点是让事情变得更简单。这是第一步。在第二步中,您可以创建一个类来创建那些非常复杂的查询,但可能是 YAGNI。
如果查询太多,您可以替换它以从 ResourceBundle 加载它们,就像在这个 问题中一样
我希望这有帮助。