【问题标题】:How to add multiline Strings in Java?如何在 Java 中添加多行字符串?
【发布时间】:2021-02-01 00:28:42
【问题描述】:

如何使长查询更具可读性?

比如我有这个:

String query = "SELECT CASE WHEN EXISTS (SELECT * FROM users WHERE username = 'username' AND user_password = crypt('password', user_password)) THEN 'match' ELSE 'differ' END";

而且完全看不懂,有什么办法美化一下吗?

【问题讨论】:

  • 有一个库jooq.org。它有助于用类似 Java 的语法编写查询。如果你想要这样的东西,请检查链接。
  • “美”是主观的。
  • 如果您不使用 Java15(就像您在下面接受的答案),您可以在运行时从存储在应用程序资源文件夹中的 SQL 文件中加载它们。您甚至可以使用反射和注释将它们注入字符串变量中。它与您的代码并不完全“内联”,但 SQL 文件中的 SQL 看起来很棒:)

标签: java sql


【解决方案1】:

从Java 15开始,你可以使用text blocks

String query = """
               SELECT CASE 
                  WHEN 
                      EXISTS (
                         SELECT * 
                         FROM users 
                         WHERE 
                             username = 'username' 
                             AND user_password = crypt('password', user_password)
                      ) 
                  THEN 'match' 
                  ELSE 'differ' 
                  END
                """;

【讨论】:

  • 这太棒了。我可能迟早会迁移到 Java 15。
【解决方案2】:
  1. 如果您不想混合 SQL 和 JAVA,您可以将 SQL 查询放在 .sql 文件中。并在需要时获取此文本。

    public class QueryUtil {
        static public String getQuery(String fileName) throws IOException {
            Path path = Paths.get("src/test/resources//" + fileName + ".sql");
            return Files.readAllLines(path).get(0);
        }
    }
    
  2. 如果您可以混合使用 SQL 和 JAVA,那么从 JDK15 开始,您可以使用文本块。

  3. 您还可以使用 JOOQ 从您的数据库生成 Java 代码,它有很多好处。

【讨论】:

  • 我会让 Path 对象相对于运行时类路径而不是源子目录。
【解决方案3】:

假设您不能迁移到 Java 的 8 版以上(或者即使您可以),到目前为止,最好的解决方案是使用 ORM。对于 Java,它几乎可以归结为 HibernatejOOQ。 jOOQ(可能还有 Hibernate,我没用过,所以不能说,抱歉)允许您使用流畅的编程接口,这非常符合现有的 Java 代码风格和模式。

使用 ORM 的另一个特定优势是,您可以非常轻松地更改您使用的数据库引擎,而无需更改您编写的 Java 代码除了在设置函数中更改 SQL 方言.见https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SQLDialect.html

【讨论】:

    【解决方案4】:

    您可以使用 JOOQ 并获得多种其他好处,例如类型安全、自动完成、轻松映射和强大的支持。

    到目前为止,已经将它用于多个项目以及 Kotlin Exposed 等竞赛,但总是回到 JOOQ。

    【讨论】:

      【解决方案5】:

      迁移到 Java 13+。这个有Text Blocks

      或者使用一些ORM library

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 2014-08-06
        • 2013-06-01
        • 2012-02-23
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        相关资源
        最近更新 更多