jOOQ的使用场景

2023-12-13 15:22:39

jOOQ的使用场景

jOOQ最初是作为一个库完全是JDBC和所有的数据库交互的抽象层而被创建。 在已有的软件产品中经常遇到的各种最佳实践被应用到这个库中。包含如下:

  • 类型安全数据库对象引用,通过自动生成的模式, 表, 列,记录, 存储过程,类型,DAO, POJO(具体可以看代码生成章节)。
  • 类型安全的SQL构造/SQL构建,通过完整的DSL查询API, 建模出SQL在java语言中作为特定领域的语言。 (阅读DSL查询api章节)。
  • SQL方言抽象和SQL子句仿真,以改进跨数据库兼容性,并在更简单的数据库中启用丢失的特性(查看SQL方言章节)
  • 使用jOOQ作为开发过程中不可或缺的一部分进行SQL日志记录和调试。

实际上,jOOQ最初设计的目的是取代除处理连接池之外的任何其他数据库抽象框架。

以你喜欢的方式使用jOOQ

…但是开源是社区驱动的。 社区已经展示了各种不同于最初意图的使用jOOQ的方法。遇到的一些用例是:

  • 使用Hibernate解决70%的查询(即:CRUD),剩下的30%部分使用JOOQ。 这30%确实需要操作SQL
  • 使用jOOQ用于SQL的构建, JDBC用于SQL的执行。
  • 使用jOOQ用于SQL的构建, Spring Data 用于SQL的执行。
  • 使用jOOQ, 而不使用其源码生成器去构建框架基础,用于动态SQL执行。

下面部分解释了在你的应用中,使用jOOQ的各种各样的案例。

jOOQ不使用代码生成器时,作为一个SQL生成器

我们强烈推荐使用jOOQ并使用其代码生成器来充分列用jOOQ的特性!

然后, 如果你拥有一个动态的模式, 则不必使用代码生成器。 这是所有的使用场景中最简单的方式, 允许为任何数据库构建有效的SQL。在这种应用场景中, 你将不必使用jOOQ的代码生成器,甚至可能都没有jOOQ的查询执行工具。相反,您将使用jOOQ的查询DSL API将字符串、文字和其他用户定义的对象包装到一个面向对象的、类型安全的AST中,对SQL语句进行建模。如下给出一个案例:

// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
// For simplicity reasons, we're using the API to construct case-insensitive object references, here.
Query query = create.select(field("BOOK.TITLE"), field("AUTHOR.FIRST_NAME"), field("AUTHOR.LAST_NAME"))
 .from(table("BOOK"))
 .join(table("AUTHOR"))
 .on(field("BOOK.AUTHOR_ID").eq(field("AUTHOR.ID")))
 .where(field("BOOK.PUBLISHED_IN").eq(1948));

String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();

使用jOOQ查询DSL构建的SQL可以直接被JDBC所执行, 使用Spring的JdbcTemplate, 使用Apache DbUtils和很多其他工具(注意, 自从jOOQ缺省使用 java.sql.PreparedStatement, 对于“1987”,将会生成一个绑定变量, 可以阅读绑定变量部分)

你也可以避免单独获取SQL字符串和绑定变量:

String sql = query.getSQL(ParamType.INLINED);

如果您希望仅将jOOQ用作SQL构建器,那么手册的以下部分可能会引起您的兴趣:

  • SQL building: 这部分包含了很多信息关于如何使用jOOQAPI来创建SQL语句
  • 普通SQL: 这一章节中包含了有用的信息, 特别的对于一些开发者,他们想支持表表达式, 列表达式, 即:对jOOQ使用普通SQL, 而不是通过自动生成的一些工具类
  • 绑定值:本节解释如何在jOOQ中管理和/或内联绑定值。

使用代码生成器,用jOOQ作为SQL构建器

除过上述章节中使用独立的SQL构建器, 您还可以使用jOOQ的代码生成特性,以便使用Java编译器针对实际的数据库模式编译SQL语句。这为仅仅使用DSL查询和自定义字符串和文字构造SQL增加了很多功能和表现力,因为您可以确保所有数据库工件实际上存在于数据库中,并且它们的类型是正确的。我们强烈建议使用这种方法。 如下给出了一个例子:

// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
Query query = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
 .from(BOOK)
 .join(AUTHOR)
 .on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
 .where(BOOK.PUBLISHED_IN.eq(1948));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();

使用jOOQ查询DSL构建的SQL可以直接被JDBC所执行, 使用Spring的JdbcTemplate, 使用Apache DbUtils和很多其他工具(注意, 自从jOOQ缺省使用 java.sql.PreparedStatement, 对于“1987”,将会生成一个绑定变量, 可以阅读绑定变量部分)

你也可以避免单独获取SQL字符串和绑定变量:

String sql = query.getSQL(ParamType.INLINED);

如果您希望仅将jOOQ用作SQL构建器,那么手册的以下部分可能会引起您的兴趣:

  • SQL building: 这部分包含了很多信息关于如何使用jOOQAPI来创建SQL语句
  • 普通SQL: 这一章节中包含了有用的信息, 特别的对于一些开发者,他们想支持表表达式, 列表达式, 即:对jOOQ使用普通SQL, 而不是通过自动生成的一些工具类
  • 绑定值:本节解释如何在jOOQ中管理和/或内联绑定值。

jOOQ作为一个SQL执行器

除过前面提到的任何工具, 你也可以直接使用jOOQ来执行jOOQ生成的SQL语句。这将在前面讨论用于SQL类型安全构建的的API的基础上增加许多便利,此时可以重用来自自动生成的类,获取记录和自定义数据类型。如下给出一个案例:

// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
 .from(BOOK)
 .join(AUTHOR)
 .on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
 .where(BOOK.PUBLISHED_IN.eq(1948))
 .fetch();

通过让jOOQ执行SQL, jOOQ查询DSL变成了真正的嵌入式SQL。

不过,jOOQ并不止于此! 您可以使用jOOQ执行任何SQL。换句话说,您可以使用任何其他SQL构建工具并使用jOOQ运行SQL语句。下面是一个例子:

// 使用你喜爱的工具构建sql字符串。
String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
 "WHERE book.published_in = 1984";

// 使用jOOQ获取数据
Result<Record> result = create.fetch(sql);
// 或者使用JDBC获取数据。
ResultSet rs = connection.createStatement().executeQuery(sql);
Result<Record> result = create.fetch(rs);

果您希望使用jOOQ作为SQL执行器(或不使用)代码生成,手册的以下部分将对您感兴趣:

  • SQL构建: 本节包含大量关于使用jOOQ API创建SQL语句的信息
  • 代码生成: 本节包含针对开发人员数据库运行jOOQ代码生成器所需的信息
  • SQL执行: 本节包含大量关于使用jOOQ API执行SQL语句的信息
  • 获取: 本节包含一些有用的信息,介绍使用jOOQ获取数据的各种方法

使用SQL做增删改查

除了jOOQ流畅的API用于查询构造之外,jOOQ还可以帮助您执行日常的CRUD操作。下面是一个例子:

// Fetch an author
AuthorRecord author = create.fetchOne(AUTHOR, AUTHOR.ID.eq(1));
// Create a new author, if it doesn't exist yet
if (author == null) {
 author = create.newRecord(AUTHOR);
 author.setId(1);
 author.setFirstName("Dan");
 author.setLastName("Brown");
}
// Mark the author as a "distinguished" author and store it
author.setDistinguished(1);
// Executes an update on existing authors, or insert on new ones
author.store();

如果您希望使用jOOQ的所有特性,那么您可能会对手册的以下部分感兴趣(包括所有分段):

  • SQL构建: 本节包含大量关于使用jOOQ API创建SQL语句的信息
  • 代码生成: 本节包含针对开发人员数据库运行jOOQ代码生成器所需的信息
  • SQL执行: 本节包含大量关于使用jOOQ API执行SQL语句的信息

jOOQ对于专业人士

jOOQ不仅仅是一个可以帮助您构建和执行SQL的工具以应对你产生的,兼容的模式。jOOQ附带了很多工具。以下是jOOQ附带了很多工具。 这里列举jOOQ附带的非常重要的工具:

  • jOOQ执行监听器: jOOQ允许你挂载你自定义的监听器到jOOQ的SQL语句执行生命周期,以便集中协调对正在执行的SQL执行的任何任意操作。使用这个特性,将其用于日志记录、身份生成、SQL跟踪、性能测量等。
  • 日志: jOOQ内嵌了标准的DEBUG日志输出器, 记录跟进所有你正在执行的SQL语句并获取结果。
  • 存储过程: jOOQ支持存储过程和 你喜爱的任何数据库的方法。 所有例程和用户定义类型都会生成,并且可以包含在jOOQ的SQL构建中。
  • 批量执行: 在执行大量SQL语句时,批处理执行非常重要。与JDBC比较,jOOQ简化了这样的操作。
  • 导出和导入: jOOQ附带的API将很容易的以各种各样的格式导入和导出数据。

如果你是一个你喜爱的功能丰富的数据库的高级用户, jOOQ将帮助您访问数据库供应商的所有特定SQL特性,例如OLAP特性, 存储过程, 用户自定义类型,制造商特定SQL, 函数, 以及更多。 本指南中包含了这些例程。

如下为jOOQ的学习大纲的思维导图:https://www.drawon.cn/template/details/656ac5efc083fb5228fc17f8

文章来源:https://blog.csdn.net/besidemyself/article/details/134940156
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。