最常见的jOOQ类型的简要概述

216 阅读8分钟

对于第一次使用jOOQ的新用户来说,jOOQ API中的类型数量可能会让人不知所措。SQL语言没有很多这样的 "可见 "类型,尽管如果你以jOOQ的方式来思考SQL,那么它们也是存在的,只是通过英语风格的语法对用户隐藏起来。

这个概述将以小抄的形式列出最重要的jOOQ类型。

配置类型

这个类型是最重要的配置类型。 [Configuration](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Configuration.html)是唯一最重要的配置类型,它包含对所有其他类型配置的引用。 [Settings](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html),自定义SPI实现,JDBC或R2DBC [Connection](https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/Connection.html),等等。SPI包括。

还有很多,你可以从 [Configuration](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Configuration.html)Javadoc

它可以从每个 [Scope](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Scope.html)类型中提供,详见下文

作用域

这些 [Scope](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Scope.html)类型是在一个 "范围 "内创建的各种类型。 [Configuration](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Configuration.html)的 "范围 "内创建的各种类型,因此可以提供对该类型中所有的 [Configuration](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Configuration.html)的所有对象和SPI。这种设计允许在整个jOOQ的内部进行极其灵活的、程序化的依赖注入。一些最重要的Scope 类型包括。

  • [Context](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Context.html):用于对表达式树的单一遍历,以产生一个SQL字符串和/或一个绑定变量列表。QueryPart表达式树的单一遍历,以产生一个SQL字符串和/或一个绑定变量的列表。
  • DSLContext:用于生成SQL字符串和/或绑定变量列表的DSL的API,用于在Query的上下文中创建实例。Configuration.它共享被包裹的Configuration的生命周期。
  • ExecuteContext:用于一个单一的执行Query,包含JDBC资源和其他执行相关对象。可以被ExecuteListenerSPI。

对于其他类型,请参考 [Scope](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Scope.html)Javadoc。

设置

[Settings](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html)大部分是标量标志,指定jOOQ中的详细行为。一些特定的例子包括。

  • [Settings.executeLogging](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#executeLogging):打开/关闭jOOQ中内置的执行日志
  • [Settings.fetchSize](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#fetchSize):在创建的Statement ,指定默认的JDBCfetchSizePreparedStatement
  • [Settings.statementType](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#statementType):是否执行StatementPreparedStatement 来运行你的查询。

截止到jOOQ 3.17,有超过160个这样的设置,所以我们不能在这里全部列出。关于更多的细节,请参考 [Settings](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html)Javadoc。

DSL类型

DSL API是与jOOQ合作的最重要的API。它有两种类型。

静态DSL

静态 [DSL](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/impl/DSL.html)包含了每种类型的QueryPart 构建DSL的入口点,包括。

  • Query 类型
  • [Field](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Field.html)类型
  • [Condition](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Condition.html)类型
  • [Table](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Table.html)类型

...以及更多的类型。所有这些类型都是静态构建的,因此,它们没有附带任何Configuration

上下文 "DSL

"上下文 "DSL,由 DSLContext类型所代表的 "上下文 "DSL,只提供构造QueryPart ,这些类型可以从 "在上下文 "中创建的一个 [Configuration](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Configuration.html).这主要只是包括。

一个由DSLContext 类型构建的Query ,可以直接通过使用 [Query.execute()](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Query.html#execute())[ResultQuery.fetch()](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html#fetch()),或其他许多执行方法,包括异步或反应式的。

步骤类型

在整个DSL API中,你会看到所谓的 "Step "类型,即带有 "Step "后缀的类型,例如,e.g. [SelectFromStep](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SelectFromStep.html),它是一个 "步骤",可以访问 [Select](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Select.html)DSL的FROM 子句。

你不应该直接引用这些类型,也不应该在你自己的代码中看到它们。它们是中间的DSL工件

查询部分类型

[QueryPart](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/QueryPart.html)是整个jOOQ表达式树或模型API的共同基础类型。你用DSL API构造的每个类型都将扩展QueryPart ,例如。

QueryPart p1 = TABLE;
QueryPart p2 = TABLE.COLUMN;
QueryPart p3 = TABLE.COLUMN.eq(1);

上述表达式产生的类型比QueryPart ,更具体,我们将在后面解释,但它们都扩展了QueryPart

一个QueryPart ,是一个可以在Configuration 的上下文中呈现的类型,使用 [DSLContext::render](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/DSLContext.html#render(org.jooq.QueryPart))

String sql = ctx.render(TABLE.COLUMN.eq(1));

最重要的QueryPart 子类型包括。

A `[Table](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Table.html)`可以在SELECT 语句的FROM 子句中使用,或者作为DML语句的目标,等等。有各种不同的表类型,包括。

  • 最常见的Table :来自生成代码的表引用,如TABLE
  • 一个非生成的Table ,可以用以下方式构建。 [DSL.table(Name)](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/impl/DSL.html#table(org.jooq.Name))
  • 一个普通的SQLTable,可以使用 [DSL.table(String)](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/impl/DSL.html#table(java.lang.String)).它可以包含任何SQL逻辑,包括jOOQ可能不支持的表表达式。
  • 连接表是基于连接运算符和Table 操作数的表表达式
  • 别名表是FROM 子句中提供别名声明的表表达式。
  • VALUES() 表的构造函数可以用来生成内存中的表数据。
  • 派生表是 FROM 子句中的子查询。
  • 表值函数是产生表表达式的函数
  • [XMLTABLE](https://www.jooq.org/doc/latest/manual/sql-building/table-expressions/xml-table-function/)是一个基于XML文档的表表达式
  • [JSON_TABLE](https://www.jooq.org/doc/latest/manual/sql-building/table-expressions/json-table-function/)是一个基于JSON文档的表表达式

在jOOQ中还有很多可能的表表达式,都是实现了 `` `[Table](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Table.html)` ``类型。一个使用Table 表达式的例子是。

Table<?> joined = CUSTOMER
    .join(ADDRESS)
    .on(ADDRESS.CUSTOMER_ID.eq(CUSTOMER.CUSTOMER_ID));

虽然大多数jOOQ语句不会与这样的局部变量一起工作,但记住一点总是很有趣的,在jOOQ中,每个查询都是一个动态SQL查询,每个SQL片段都是Java中完全自含的表达式树,可以分配给任何局部变量或从方法中返回,等等。

领域

A `[Field](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Field.html)`是一个列表达式,它可以在整个jOOQ API的很多地方使用,凡是可以使用列表达式的地方都可以使用,包括。

  • SELECT 子句
  • GROUP BY 子句(特殊类型的 [GroupField](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/GroupField.html)存在于模型 [GROUPING SETS](https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/grouping-functions/))
  • ORDER BY 子句(特殊类型的 [OrderField](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/OrderField.html)存在于模型的排序规范)
  • 作为函数参数(例如:LOG 函数)
  • 作为表达式参数(例如:CASE 表达式)。

以及更多。

条件

A [Condition](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Condition.html)只是一个Field<Boolean> ,有一些专门用于Condition 建设的额外API,包括可以调用 [Condition::and](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Condition.html#and(org.jooq.Condition)), [Condition::or](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Condition.html#or(org.jooq.Condition)),以及其他。各种条款都明确地接受Condition ,包括。

还有更多。

A [Row](https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/row-value-expressions/)或行值表达式,用来模拟一个既为值的元组。

这样的元组对于创建一个结构类型很有用,该结构类型将表达式分组为可重用的对象组。 `` `[Field](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Field.html)` ``表达式分组为可重用的对象组。一些方言也支持这种的名义变体,称为UDT(用户定义的类型),jOOQ可以通过可嵌入的类型来模拟UDT。

选择

A [Select](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Select.html)是一个特殊的类型 [ResultQuery](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)的一种特殊类型,它可以被用作。

结果查询

A [ResultQuery](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)是一个 [Query](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Query.html)可以产生 [Record](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Record.html)值的各种集合形式(例如:Stream, [Result](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Result.html),Publisher,CompletionStage, 等)。它可以从各种 [Query](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Query.html)类型创建,方法是添加RETURNING 子句

查询

A [Query](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Query.html)是一个 [Statement](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Statement.html)可以被执行的,意思是。

  • 产生一个SQL字符串
  • 准备一个PreparedStatement
  • 绑定值被绑定
  • PreparedStatement 被执行
  • 可能的话,获取一个ResultSet

为了执行一个Query ,它必须连接到一个Configuration ,这可以通过从一个Query ,最容易做到。 [`DSLContext`](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/DSLContext.html).

语句

A [Statement](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Statement.html)(不是JDBC的Statement !)是一个 [QueryPart](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/QueryPart.html)它代表了一个程序性语句。

  • 一个匿名块
  • A [PROCEDURE](https://www.jooq.org/doc/latest/manual/sql-building/ddl-statements/create-statement/create-procedure-statement/)
  • A [FUNCTION](https://www.jooq.org/doc/latest/manual/sql-building/ddl-statements/create-statement/create-function-statement/)
  • A [TRIGGER](https://www.jooq.org/doc/latest/manual/sql-building/ddl-statements/create-statement/create-trigger-statement/)

所有的 `[Query](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Query.html)`的实现都可以作为 `[Statement](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Statement.html)`在这样一个过程性上下文中。

QOM类型

[QOM](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/impl/QOM.html)(查询对象模型)类型是一组实验性的类型,公开声明了内部模型API,这对树形遍历SQL转换非常有用

结果类型

当执行一个 [ResultQuery](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)时,有不同类型的 `[Result](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Result.html)`jOOQ所支持的。 [Result](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Result.html)是默认的。

结果

[Result](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Result.html)类型是一个 List<[Record](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Record.html)>具有大量的映射便利API。它是一个急于获取的JDBCResultSet 的模型,它包含了所有来自数据库的结果,而没有对ResultSet 本身的引用。当结果集的大小适中时,这很有用。

游标

[Cursor](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Cursor.html)类型是一个 Iterable<`[Record](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Record.html)`>具有类似于 [Result](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Result.html)类型,但它包含一个开放的JDBCResultSet ,允许以一种懒惰的方式从服务器上获取数据。当结果集很大时,这很有用。

记录

A `[Record](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Record.html)`是一个数据库记录的基础类型。它允许基于字段的单个属性的访问,以及映射到自定义数据类型的便利。它的专长是。

  • Record1 - ,代表1-22列记录的类型安全版本,产生于一个 Record22`[ResultQuery](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/ResultQuery.html)`.
  • [TableRecord](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/TableRecord.html)来表示一个 `[Record](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Record.html)`源自于一个单一的 `[Table](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Table.html)`,以备 `[Table](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/Table.html)`是用代码生成器生成的。
  • [UpdatableRecord](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/UpdatableRecord.html)代表一个 [TableRecord](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/TableRecord.html)有一个已知的主键,这意味着对记录的任何修改都可以被存储到数据库中。这对于基本的CRUD操作是非常有用的。

收藏这个

觉得这个列表有用吗?请把它收藏起来,因为我们会在将来增加更多的类型,以备出现新的重要概念。