在Java中处理丑陋的SQL

这是一个SQL-Java编码风格的问题……

这里的其他人如何处理用Java创建复杂的自定义查询?

我说的是一个看似简单的准备字符串的任务,这是要执行的SQL语句。

我知道HQL以及存储过程,但说实话,我并不喜欢这些解决方案。 也许我可以说服不同。 存储过程对于部署/维护很烦人,在我的情况下解析性能不是一个大问题 – 灵活性优先。 HQL似乎是一个很大的飞跃,并且对我的复杂查询有一些限制。

要清楚,我说的是像这样的超丑看代码:

return "(" + topTwenty + ")" + "UNION " + "(" + twentyBeforeMe + ")" + "UNION " + "(" + meDummyQuery + ")" + "UNION " + "(" + twentyAfterMe + ")"; 

例如,变量topTwenty也是类似地创建的子查询。

我从来没有想过我会说这个,但它在PHP中更干净,它有多行字符串和$变量嵌入字符串。

人们有没有使用过琐碎的模板库? 你如何整齐地保持程序中的字符串? 或者你把它们放在一个单独的文件中(似乎对我来说似乎很烦人)。

我所做的是将String.format用于表名和无法参数化的东西,以及这个类 (NamedPreparedStament),它允许使用绑定变量的好名称而不是问号。

 String sql = "SELECT id FROM %s WHERE id > :lastInsertedYesterday "; NamedParameterStatement p = new NamedParameterStatement(con, String.format(sql, "table1")); p.setInt("lastInsertedYesterday", lastOne); 

无需进入数据库抽象,您可以使用PreparedStatment使查询更具可读性 – 更不用说它有助于提高安全性。

您可能希望查看参数化您可以使用JDBC PreparedStatement执行的查询。 如果您来自PHP世界,那就类似于PDO。 基本上。 您在上面提到的PHP字符串中的所有动态$variable都是? s在参数化查询中。 的? s通过PreparedStatement实现的方法以安全(读取正确的转义 )方式替换。

有关示例和进一步说明,请参阅Sun的PreparedStatement教程 。

Java具有PrintFormat类,它与C中的sprintf非常相似,您可能希望利用它来格式化查询。

以下代码段摘自http://java.sun.com/developer/technicalArticles/Programming/sprintf/

 System.out.println( new PrintfFormat("Pre %s Post%%").sprintf("target") ); 

SQL构建集 ,这是我的项目顺便说一下。

您可以尝试使用StringBuilder.append(),如果您认为这将使您的代码看起来更干净:

 return new StringBuilder() .append("(").append(topTwenty).append(")") .toString();