如何从其他代码中读取长SQL?

Art*_*tem 5 java sql readability

这是一个非常开放的问题,但我认为它对SQL可读性非常有益.

所以你有一个Java程序,并且你试图从它调用一个怪物SQL语句,有许多子查询和连接.我的问题的起点是一个字符串常量,如下所示:

static string MONSTER_STATEMENT = 
  "SELECT  " +
  "   fields" +
  "WHERE "+
  "   fieldA = (SELECT a FROM TableC) " +
  "AND fieldB IN (%s)" +
  "AND fieldC = %d " +
  "FROM "
  "   tableA INNER JOIN tableB ON ...";
Run Code Online (Sandbox Code Playgroud)

它稍后使用String.format填充并执行.

你有什么技巧让这种东西可读?你分开你的内部联接吗?你在字符串中缩进SQL本身吗?你把评论放在哪里?请分享你的武器库中的所有技巧.

Yis*_*hai 0

如此复杂的 SQL 应该放在准备好的语句中,而不是放在一起String.format以避免 SQL 注入问题。

我执行以下两件事之一:将其包装在可调用语句中或将其放入配置/xml 文件中。Java 源文件不适合存放复杂的 SQL。

话虽如此,IDEA 具有语言格式化功能,可以将 Java 中的字符串格式化为不同的语言(基于它们传递给的方法或基于注释),因此可以提供帮助。

编辑:鉴于您的情况,我同意可调用语句可能行不通。即使对于内部开发,准备好的语句仍然是值得的,只是因为带有撇号的参数可以炸毁所有内容(即使没有攻击者),所以在我看来,付出额外的努力来创建字符串仍然是值得的仅在代码中动态地(String.format 或其他任何内容)处理无法作为参数传递的部分(例如示例中的临时表名称),然后将其用作准备好的语句,为其余部分传递适当的参数。

至于让它不那么丑陋,看起来配置/xml 类型文件就是我想要的。