我有几个实例,其中一部分遗留 sql 语句基于依赖项。例如。
if (x !=null)
{
SQL = "SELECT z WHERE x > y";
}
else
{
SQL = "SELECT z WHERE x <= y";
}
SQL2 = SQL + " JOIN a ON b";
我正在使用这个遗留代码创建 PreparedStatements。这里的最佳实践是什么。我应该为 var SQL 创建一个 PreparedStatement 并将其嵌套在 SQL2 中,还是应该有多个基于 SQL2 的 PreparedStatements 而无需嵌套,或者完全不同的东西?
代码比示例复杂得多,因为 SQL var 在许多长而复杂的 SQL 查询中被重用。
编辑:项目设计需要使用 PreparedStatements,此时我无法选择使用库。
最佳答案
>我是否应该为 var SQL 创建一个 PreparedStatement 并将其嵌套在 SQL2 中
没有
>或者是否应该有多个基于SQL2的PreparedStatements不嵌套
是
此外:如果您可以为每个查询创建一个字符串会更好。我真的不喜欢将 SQL 与代码混合使用。它使调试和理解变得更加困难,您无法复制/粘贴到 SQL 工具来轻松测试它。通过将 SQL 与您的代码分开,您可以将查询与操作(实际的提取)隔离开来,这样维护起来会更容易。另外,如果代码不是您的,那么理解起来会容易得多。
看起来你在重复字符串并不重要,重点是尽可能简化语句。
我会做这样的事情:
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 中加载它们,例如 question
希望对您有所帮助。
关于java - 嵌套 PreparedStatements 的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387417/