JOOQ 与 SQL 查询

JOOQ vs SQL Queries

我现在正在使用 jooq 查询...我觉得 SQL 查询看起来更具可读性和可维护性,以及为什么我们需要使用 JOOQ 而不是使用本机 SQL 查询。

有人可以解释一下使用它的原因吗?

谢谢。

以下是使用原生(基于字符串)永远无法获得的最高价值主张SQL:

  • Dynamic SQL 是 jOOQ 真正擅长的。您可以根据用户输入、配置等动态地编写最复杂的查询,并且仍然确保查询 运行 正确。
  • 动态 SQL 的一个经常被低估的效果是您可以将 SQL 视为代数,因为编写原生 SQL 语法并不困难(使用所有关键字和奇怪的括号规则等),您可以根据表达式树来思考,因为您实际上是在为查询构建表达式树。这不仅可以让您实现更复杂的功能,例如 SQL 转换为 multi tenancy or row level security, but every day things like transforming a set of values into a SQL set operation
  • 供应商不可知论。一旦您必须支持多种 SQL 方言,手动编写 SQL 几乎是不可能的,因为方言之间存在许多细微差别。 jOOQ 文档说明了这一点,例如与LIMIT clause。一旦这是你遇到的问题,你必须使用 JPA(非常受限的查询语言:JPQL)或 jOOQ(在 SQL 用法方面几乎没有限制)。
  • 类型安全。现在,您在编写视图和存储过程时也会获得类型安全,但很多时候,您希望 运行 来自 Java 的临时查询,并且无法保证 table 名称、列名、列数据类型或语法正确性,当您以基于字符串的方式执行 SQL 时,例如使用 JDBC 或 JdbcTemplate 等。顺便说一下:jOOQ 鼓励您使用尽可能多的视图和存储过程。它们完全符合 jOOQ 范式。
  • Code generation。这导致更多的类型安全。您的数据库模式成为您的客户端代码的一部分。当您的查询不正确时,您的客户端代码将不再编译。想象一下有人重命名了一个列而忘记重构使用它的 20 个查询。 IDE 仅在首次编写查询时提供一定程度的安全性,在您重构架构时它们不会帮助您。使用 jOOQ,您的构建会失败,您可以在投入生产之前很久就解决问题。
  • 文档。生成的代码还充当您的模式的文档。在您的 tables 上的评论,列变成 Javadoc,您可以在您的客户端语言中进行内省,而无需在服务器中查找它们。
  • 使用 jOOQ 数据类型绑定非常容易。想象一下使用 100 个 stored procedures 的库。您不仅能够安全地访问它们类型(通过代码生成),就好像它们是实际的 Java 代码一样,而且您不必担心绑定每个代码的繁琐和无用的 activity单个输入和输出参数到类型和值。

从上面派生出大量更高级的功能,例如:

而且,如果您偶尔认为使用纯原生 SQL 可以简单得多,那么只需:

免责声明:当我为供应商工作时,我显然有偏见。