jOOQ 3.14发布—支持SQL/XML和SQL/JSON

917 阅读7分钟

jOOQ 3.14已经发布,支持SQL/XML、SQL/JSON、Kotlin代码生成、可嵌入类型和域类型、合成约束、更好的MERGE支持以及更多SQL转换

在这个版本中,我们根据用户反馈对github问题进行了分类,最终实现了一些最想要的功能,其中包括更好的 Kotlin支持、可嵌入类型和域类型支持。除此之外,我们相信我们新增加的对XML和JSON操作的支持将成为未来ORM与SQL数据库交互方式的一个领先的游戏改变者

XML和JSON

标准SQL长期以来一直支持SQL/XML,而且从最近开始,大多数RDBMS也,支持标准SQL/JSON或其供应商的特定变体。虽然ORDBMS的扩展从未得到应有的采用,但XML和JSON却得到了采用。偶尔对数据进行去规范化处理,并直接将文档存储在数据库,是有意义的。然而,这并不是我们最兴奋的事情。

我们为我们对所有花哨的操作符的支持感到兴奋,比如:

  • JSON_TABLE将JSON值变成SQL表
  • JSON_ARRAY, JSON_OBJECT, JSON_VALUE从值中构造JSON数据
  • JSON_ARRAYAGG, JSON_OBJECTAGG将数据聚合成嵌套的JSON文档。
  • JSON_EXISTS用于查询具有JSON路径的文件。

类似的函数也可用于XML,如XMLTABLE、XMLELEMENT、XMLAGG等。
jOOQ 3.14的所有版本都支持标准的SQL XML和JSON操作符,并在有非标准支持的地方(如PostgreSQL和SQL Server),模拟它们。商业版本还支持SQL Server非常方便的FOR XML和FOR JSON APIs,在其他地方使用标准操作符来模拟该语法见:

blog.jooq.org/2020/05/05/…

但这还不是全部! 如果你在classpath上有Gson、Jackson或JAXB,我们可以使用它将org.jooq.XML、org.jooq.JSON、org.jooq.JSONB类型从你的查询结果自动映射到你的嵌套数据结构见:

blog.jooq.org/2020/10/09/…

这些方法是非常强大的。在很多情况下,你可以跳过,直接将REST或类似的端点绑定到jOOQ / SQL查询,为你的前端产生JSON:

blog.jooq.org/2019/11/13/…

支持Kotlin

我们长期支持一些Scala扩展和ScalaGenerator。Kotlin是一种额外的非常有前途的JVM语言,其中一个新的jOOQ-kotlin模块以及KotlinGenerator将为你的jOOQ/Kotlin整合增加很多价值。KotlinGenerator提供了,除其他事项外:

  • 对生成的POJO的数据类支持
  • 对生成的POJO、接口和记录的属性支持
  • 更好的无效性支持

jOOQ-kotlin模块提供了一些有用的扩展功能,以进一步改善jOOQ/Kotlin集成的体验:

除了上述内容外,我们还用JetBrains的nullability
注释来注释整个jOOQ API:

  • org.jetbrains.annotations.Nullable
  • org.jetbrains.annotations.NotNull

这将消除你的Kotlin/jOOQ代码中许多恼人的T!类型,把它们变成T或T?类型,让你更有信心。通过这些改进,我们还严格审查了我们现有的ScalaGenerator,修复了很多bug。

可嵌入类型

jOOQ 3.14中最大的新特性之一是受到JPA的启发,它在,并带有可嵌入类型。可嵌入类型是对数据库用户定义类型(UDT)的模拟,只有Oracle和PostgreSQL支持这种类型。这种类型最大的好处是在你的数据库模式中创建更多的语义、复合数据类型,并从额外的类型安全中获益。 我们对该功能的解释主要是在源代码生成器中,它的输出现在变得更有价值了。所有的jOOQ版本都支持基本的基础设施,以模式匹配列集,并将它们变成合成的可嵌入类型。 除了上述内容外,我们的商业版本还提供了一些自动配置
的可嵌入类型,在这种情况下,它们才真正发挥了作用:

  • 对于主/唯一约束和其匹配的外键
  • 对于DOMAIN类型(见下文)
  • 处理重叠的可嵌入类型
  • 允许可嵌入类型取代其基础列

我们把这个概念比JPA更进一步。在jOOQ中,可嵌入类型可以作为,作为底层列的视图,而不取代它们,或者像JPA中那样作为一个替换。jOOQ尊重关系建模的所有层次,包括,重叠的约束,从而允许两个可嵌入类型重叠起来。 更多信息,请参考:

www.jooq.org/doc/3.14/ma…

DOMAIN类型

说到类型,一些数据库方言支持标准的SQL DOMAIN类型,这是一种更简单的UDTs形式。与其使用像VARCHAR(10)这样的低级技术类型,为什么不给你的单列类型起个名字,并给它们添加一些可重复使用的CHECK约束呢? 这就是DOMAIN类型:

  • 一个命名的类型
  • 对一个技术类型进行别名,比如VARCHAR(10)
  • 可能会添加一个DEFAULT表达式
  • 可能添加一个NOT NULL约束条件
  • 可能添加一组CHECK约束

以上所有内容都可以在你的模式中重复使用,如果你有商业,你甚至可以让代码生成器为你的所有领域自动生成可嵌入的类型,以便从Java的额外类型安全中获益。

欲了解更多信息,请参考:

合成约束

与上述改进的代码生成器输出相关的是合成对象,如以前支持的合成主键,现在也支持合成唯一键和外键。 如果你在数据库中对安全性和可重复使用的组件进行了大量投资,你会大量使用SQL视图。不幸的是,视图没有任何像外键约束那样的元数据--尽管元数据对你数据库设计者来说是 "显而易见 "的。通过合成约束,你可以告诉jOOQ你对底层约束的知识。

元数据对jOOQ可用的主要好处是:

  • 你现在也可以在视图上使用隐式连接了
  • 你现在可以在视图上使用JOIN ...在视图上也可以使用JOIN ... ON KEY语法
  • 你可以在视图上使用之前的可嵌入键类型,就像在表上一样

欲了解更多信息,请参考:

更好的MERGE支持

我们终于解决了对更高级的MERGE语句子的支持,现在支持 :

  • 多个WHEN MATCHED AND condition THEN UPDATE子句
  • 多个WHEN MATCHED AND condition THEN DELETE子句
  • UpdatableRecord.merge()和所有相关的好东西来简化记录的合并。

转换

有了解析器和我们的翻译工具(https://www.jooq.org/translate),我们将,越来越多地投入到新的用例中,把jOOQ作为Java中的一个可嵌入的DSL来使用。 我们的翻译能力已经很强了,有了一套新的SQL转换,它们会变得更加强大,帮助客户从RDBMS A 迁移到RDBMS B(如果他们犯了错误,还可以返回)。 虽然我们的网站翻译器是免费的,但jOOQ库总是可以,以编程方式使用,或作为一个命令行工具。

www.jooq.org/doc/3.14/ma…

为了使这种使用情况更加有用,已经添加了新的转换功能,包括:

  • ROWNUM到LIMIT或ROW_NUMBER()
  • 表列表到ANSI JOIN(包括Oracle(+)支持)
  • 不必要的算术表达式

这是一个令人兴奋的领域,我们将在未来为我们的商业授权客户进行探索,同时甚至jOOQ开源版也从
这些改进中获利。例如,为转换所创建的基础设施,终于能够模仿PostgreSQL的DISTINCT ON子句,在其他地方。

更多信息,请参考:

更好的手册

我们退一步审查了我们的文档的几个重要部分,我们现在提供:

  • 代码生成器技术(XML、Programmatic、Gradle)的粘性标签。如果 ,你正在使用Gradle与jOOQ的代码生成器,你不想再看,在手册中的XML配置。这些标签最终隐藏了不需要的信息。
  • 每个函数的分节。我们已经开始单独记录每个SQL函数,解释它在SQL中是如何工作的,并提供一些例子和示例结果。
  • 生成供应商特定的SQL的渲染实例。我们在生成手册时使用jOOQ,将一些jOOQ的API用法翻译成我们所有支持的 方言,并显示该函数在每种方言中的渲染情况。
  • 显示导入按钮并显示上下文敏感的导入。手册中的所有例子都会让人不知所措。我们假设了很多(静态)导入, ,我们最终在每个代码片段的可扩展的 "显示导入 "部分记录了
  • 我们重写了一些部分,使之更完整地包含了一些例子,例如数据导入部分。
  • 一个新的API差异页面显示了每个小版本之间的变化,Javadoc链接列表:https://www.jooq.org/api-diff