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,在其他地方使用标准操作符来模拟该语法见:
但这还不是全部! 如果你在classpath上有Gson、Jackson或JAXB,我们可以使用它将org.jooq.XML、org.jooq.JSON、org.jooq.JSONB类型从你的查询结果自动映射到你的嵌套数据结构见:
这些方法是非常强大的。在很多情况下,你可以跳过,直接将REST或类似的端点绑定到jOOQ / SQL查询,为你的前端产生JSON:
支持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尊重关系建模的所有层次,包括,重叠的约束,从而允许两个可嵌入类型重叠起来。 更多信息,请参考:
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库总是可以,以编程方式使用,或作为一个命令行工具。
为了使这种使用情况更加有用,已经添加了新的转换功能,包括:
- 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