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单个输入和输出参数到类型和值。
从上面派生出大量更高级的功能,例如:
- 可用性parser and by consequence the possibility of translating SQL。
- 模式管理工具,例如diffing two schema versions
- 基本的 ActiveRecord 支持,包括一些不错的东西,例如 optimistic locking。
- Synthetic SQL features like type safe implicit JOIN
- Query By Example.
- 一个nice integration in Java streams or reactive streams.
- Some more advanced SQL transformations(正在进行中)。
- Export and import 功能
- 简单JDBC mocking functionality, including a file based database mock.
- Diagnostics
而且,如果您偶尔认为使用纯原生 SQL 可以简单得多,那么只需:
免责声明:当我为供应商工作时,我显然有偏见。
我现在正在使用 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单个输入和输出参数到类型和值。
从上面派生出大量更高级的功能,例如:
- 可用性parser and by consequence the possibility of translating SQL。
- 模式管理工具,例如diffing two schema versions
- 基本的 ActiveRecord 支持,包括一些不错的东西,例如 optimistic locking。
- Synthetic SQL features like type safe implicit JOIN
- Query By Example.
- 一个nice integration in Java streams or reactive streams.
- Some more advanced SQL transformations(正在进行中)。
- Export and import 功能
- 简单JDBC mocking functionality, including a file based database mock.
- Diagnostics
而且,如果您偶尔认为使用纯原生 SQL 可以简单得多,那么只需:
免责声明:当我为供应商工作时,我显然有偏见。