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的使用场景
jOOQ的使用场景 jOOQ最初是作为一个库完全是JDBC和所有的数据库交互的抽象层而被创建。 在已有的软件产品中经常遇到的各种最佳实践被应用到这个库中。包含如下: 类型安全数据库对象引用,通过自动生成的模式, 表, 列,…...

Pytorch-Transformer轴承故障一维信号分类(三)
目录 前言 1 数据集制作与加载 1.1 导入数据 第一步,导入十分类数据 第二步,读取MAT文件驱动端数据 第三步,制作数据集 第四步,制作训练集和标签 1.2 数据加载,训练数据、测试数据分组,数据分batch…...

pycharm多线程报错的问题(未解决)
暂未解决! 看了一下可能是这里的问题: 根据建议,在walks之前加了 freeze_support() 但是没有效果。 关键是,在jupyter上运行是没有问题的! 未解决。...
【常用字符大全】含emoji表情
常用符号大全 ❤❥웃유♋☮✌☏☢☠✔☑♚▲♪✈✞↑↓◆◇⊙■□△▽─│♥❣♂♀☿Ⓐ✍✉☣☤✘☒♛▼♫⌘☪≈←→◈◎☉★☆⊿※¡━┃♡ღツ☼☁❅♒✎©™Σ✪✯☭➳卐√↖↗●◐Θ◤◥︻〖〗┄┆℃℉✿ϟ☃☂✄¢€£∞✫★✡↙↘○◑⊕◣◢︼【】┅┇…...
android 蓝牙开关设置
frameworks/base/packages/SettingsProvider/res/values/defaults.xml <bool name"def_bluetooth_on">false</bool>将 def_bluetooth_on 的值设为false(系统默认开启值) adb动态设置 关闭:adb shell settings put gl…...
C++ extern “C“ 用法
extern “C” 由于c中需要支持函数重载,所以c和c中对同一个函数经过编译后生成的函数名是不相同的 extern “C” 的主要作用就是为了实现c代码能够调用其他 c 语言代码。 1(不常用) //告诉编译器 show() 函数按c语言的方式进行编译和链接 extern "C" voi…...

HTML面试题---专题四
文章目录 一、前言二、如何在 HTML 中嵌入音频文件?三、解释 <script> 标签中 defer 属性的用途。四、如何在 HTML 中创建粘性/固定导航栏?五、HTML 中的 span 元素的用途是什么?六、如何使 HTML 元素可拖动?七、解释 <i…...

stm32项目(11)——基于stm32的俄罗斯方块游戏机
1.功能设计 使用stm32f103zet6平台,以及一块LCD屏幕,实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度! 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…...
【计算机网络基础2】IP地址和子网掩码
1、IP地址 网络地址 IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。 广播地址 广播地址通常称为直接广播地址,是为了区分受限广播地址。 广播地址与网络地址的主机号正…...
ES6-import后是否有{}的区别
在ES6中,import语句用于导入其他模块中的变量、函数、类等。在使用import语句时,可以选择是否使用花括号{}来包裹导入的内容,这会影响导入的内容的使用方式。 1.使用花括号{}: 当使用花括号{}时,表示只导入指定的变量…...

rv1126-rv1109-以太网功能-eth-(原理篇)
这里只是浅浅分析一下 1.主控里面会内置mac 2.mac有组接口接到phy(网络芯片:8201) 3.phy(网络芯片:8201)接到网口 //这里就到达硬件的接口了,大致就是这个原理; 4.然后涉及到软件部分 就是mdio总线;这个总线是注册phy用的; 如果注册失败会导致网口无法使用 [ 1.002751] m…...

【IDEA】反向撤销操作快捷键 ctrl+shift+z 和搜狗热键冲突的解决办法
当我们执行某些操作时与搜狗热键冲突,直接取消搜狗的快捷键即可!!!以下以 ctrlshiftz 为例。 在输入悬浮框右键找到更多设置 按键里面找到系统功能快捷键设置 取消掉冲突的热键即可...

数据结构之----逻辑结构、物理结构
数据结构之----逻辑结构、物理结构 目前我们常见的数据结构分别有: 数组、链表、栈、队列、哈希表、树、堆、图 而它们可以从 逻辑结构和物理结构两个维度进行分类。 什么是逻辑结构? 逻辑结构是指数据元素之间的逻辑关系,而逻辑结构又分为…...
pip 通过git安装库
举例:安装peft库 git clone https://github.com/huggingface/peft.git cd peft python -m pip install . 解释: 使用git clone克隆PEFT库的代码。进入克隆的目录。使用python -m pip install .来安装PEFT库。 补充:使用pip安装到指定编译器…...
C语言——从终端输入 3 个数 a、b、c,按从大到小的顺序输出。
方式一 #include <stdio.h> int main() {int a, b, c, temp;printf("请输入三个数:\n");scanf("%d %d %d", &a, &b, &c);if (a < b) {temp a;a b;b temp;}if (a < c) {temp a;a c;c temp;}if (b < c) {temp…...

【JVM从入门到实战】(二)字节码文件的组成
一、Java虚拟机的组成 二、字节码文件的组成 字节码文件的组成 – 应用场景 字节码文件的组成部分-Magic魔数 什么是魔数? Java字节码文件中的魔数 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。…...
OPC UA常见故障信息代码
错误信息解释0x00000000操作成功。0x40000000值不确定,但原因不明。0x80000000值为坏,但原因不明。Bad_UnexpectedError 0x80010000发生非预期错误。Bad_InternalError 0x80020000编程或配置错误时发生内部错误。Bad_OutOfMemory 0x80030000完成操作所需…...
第20关 快速掌握K8S下的有状态服务StatefulSet
------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,K8s是如何来管理有状态服务的呢?跟着博哥来会会它们吧! 前面我们讲到了Deployment、DaemonSet都只适合用来跑无状态的服务pod,那么这里的Statefu…...

如何使用https://www.krea.ai/来实现文生图,图生图,
网址:https://www.krea.ai/apps/image/realtime Krea.ai 是一个强大的人工智能艺术生成器,可用于创建各种创意内容。它可以用来生成文本描述的图像、将图像转换为其他图像,甚至写博客文章。 文本描述生成图像 要使用 Krea.ai 生成文本描述…...

点滴生活记录2
我从小跟着我爷爷奶奶,小学六年级转到县城上小学,就没跟我奶奶他们住一起了。十一回家,把奶奶接到我这住,细想,自六年级之后,就很少跟奶奶住一起了。 奶奶(间歇性)耳聋,为…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...