java - 嵌套 PreparedStatements 的最佳实践是什么?

标签 java sql prepared-statement

我有几个实例,其中一部分遗留 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/

相关文章:

java - 用java在有限的时间内在输出中写一些东西

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

java.sql.SQLException:preparestatement 发生索引::4 处缺少 IN 或 OUT 参数错误

java - svnkit 处理带有空格的 url

java - 在拖动 JSplitPane 分隔线时如何避免(或消耗)鼠标事件?

java - 从 PostgreSql DB 中逐条获取记录

java - 使用时间戳的准备语句需要更多纳秒

如果用 group by 子句找不到记录,MySQL 返回 0 作为值

mysql - 使用连接缓冲区的连接速度极慢

mysql - 仅当在其他表中找到时才返回 mysql 结果集