jOOQ的使用场景

2023-12-12 10:30
文章标签 使用 场景 jooq

本文主要是介绍jOOQ的使用场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于jOOQ的使用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484273

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案