jOOQ - DSL API
DSL 代表领域特定语言 (Domain Specific Language)。它比 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)中选择所有列,并根据 AUTHOR 表中的 ID 列与 BOOK 表(别名为 b)中的 AUTHOR_ID 列匹配的条件与 BOOK 表连接。然后,它过滤结果,只包含 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 或结构化查询语言 (Structured Query Language) 用于通过 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”表内容的查询。
// Fetch the values from the employee table Result<Record> result = create.select(id, name, jobTitle) .from(employee) .fetch(); // Print the results 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 查询。