jOOQ - DSL API

DSL 代表领域特定语言。它比 Java 或 C 等通用语言简单。DSL 是为特定类别的问题而设计的。

例如,它与 jOOQ 一起使用,以 Java 编写 SQL 查询。虽然这些查询是用 Java 语言编写的,但它们看起来几乎像 SQL 语句。让我们通过一个例子来理解这个语句。

查看这个简单的 SQL 查询 −

SELECT *
FROM AUTHOR a
JOIN BOOK b ON a.ID = b.AUTHOR_ID
WHERE a.YEAR_OF_BIRTH > 1920
   AND a.LAST_NAME = 'Kanetkar'
ORDER BY b.TITLE;

上述 SQL 查询从 AUTHOR 表(别名为 a)中选择所有列,并将其与 BOOK 表(别名为 b)连接,条件是 AUTHOR 表中的 ID 列与 BOOK 表中的 AUTHOR_ID 列匹配。然后,它会过滤结果以仅包含 1920 年以后出生且姓氏为"Kanetkar"的作者,并按书名对结果进行排序。

以下代码片段显示了相同的 SQL 查询在 jOOQ 的 DSL 中的样子 −

Result<Record> result = create.select()
   .from(AUTHOR.as("a"))
   .join(BOOK.as("b")).on(a.ID.eq(b.AUTHOR_ID))
   .where(a.YEAR_OF_BIRTH.gt(1920)
   .and(a.LAST_NAME.eq("Kanetkar")))
   .orderBy(b.TITLE)
   .fetch();

SQL 与 DSL

SQL 或结构化查询语言用于通过 SQL 语句管理关系数据库。并且,SQL 语句是允许用户检索、插入、更新和删除数据的命令。

另一方面,DSL 旨在在特定域或应用程序领域内使用。它为该域的需求提供特殊的语法和语义。

例如,jOOQ 中的 DSL 旨在简化 Java 应用程序中的 SQL 查询创建。

领域特定语言始终依赖于通用语言。在 jOOQ 的情况下,它需要与 Java 集成。但是,SQL 独立于任何编程语言。

jOOQ 中的 DSL

如前所述,DSL 是在 jOOQ 中编写 SQL 查询的主要方式。我们还看到了它与 SQL 语句的相似之处。此外,使用 jOOQ 的 DSL 的一个主要好处是其基于 BNF 的接口层次结构。它可以防止编译错误的查询语法,从而可能不允许编译不正确的查询并防止运行时错误。

在 JOOQ 中,DSL 类和 DSLContext 接口协同工作。DSL 类是一个实用程序类,它提供用于创建表、字段和查询的工厂方法。但是,如果不使用 DSLContext,您就无法执行查询,因为 DSLContext 负责管理数据库连接和执行查询。

示例

在上一章中,我们在"mydatabase"数据库中创建了"employee"表。让我们看一个打印"employee"表内容的查询。

// 从员工表中获取值
Result<Record> result = create.select(id, name, jobTitle)
   .from(employee)
   .fetch();

// 打印结果
for (Record record : result) {
   Integer employeeId = record.get(id);
   String employeeName = record.get(name);
   String employeeJobTitle = record.get(jobTitle);
   System.out.println("ID: " + employeeId + ", Name: " + employeeName + ", Job Title: " + employeeJobTitle);
}

常用的 jOOQ DSL 方法

jOOQ DSL 类的常用方法有 −

  • using():此方法从 JDBC 连接和 SQL 方言创建 DSLContext 实例。

  • select():用于创建 Select 查询。

  • insertInto():用于创建 Insert 查询。

  • update():用于创建 Update 查询。

  • deleteFrom():用于创建 Delete 查询。