使用jOOQ DSL

本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。

在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特定语言如何可以极大地提高开发人员的生产率,从而将SQL内部化为Java。

在本课程中,我们将看到如何使用jOOQ有效地查询数据库。 在这里查看 !

目录

1. jOOQ DSL的思想 2.运行第一个查询 3.其他语句类型
3.1。 插 3.2。 更新 3.4。 删除
4.谓词
4.1。 日常谓词 4.2。 更高级的谓词 4.3。 比较谓词
5.列表达式
5.1。 在SQL中: 5.2。 使用jOOQ ::
6.有关jOOQ DSL的更多信息

也可以从org.jooq.academy.section1包中获得本节中显示的示例 。

1. jOOQ DSL的思想

jOOQ是一种DSL(领域特定语言),它模仿Java API中的标准和特定于供应商的SQL语法。 该API背后的思想很容易理解:

  • 作为内部 DSL,Java编译器可以验证您的SQL查询的语法正确性(例如,SQL关键字的正确顺序)
  • 将表和列作为生成的Java对象,编译器还可以验证元数据的正确性(例如,正确的列名和类型)

换句话说,当您要表达这样的SQL查询时:

SELECT   author.first_name, author.last_name
FROM     author
ORDER BY author.id

…然后您可以立即使用jOOQ编写相同的查询

select  (AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from   (AUTHOR)
.orderBy(AUTHOR.ID);

它是如何工作的,jOOQ和您的Java编译器如何知道“ select ”的含义或“ AUTHOR.FIRST_NAME ”的含义?

2.运行第一个查询

在上面的示例中,进行了两个简单的假设,并将在整个过程中进行以下假设:

  • 每当您看到独立的SQL关键字时,都可能是从org.jooq.impl.DSL静态导入的。
  • 每当您看到独立的表引用时,它就可能是从生成的Tables类中静态导入的

换句话说,理想情况下,在每个使用jOOQ的类中,只需添加以下两个import语句:

import static org.jooq.example.db.h2.Tables.*;
import static org.jooq.impl.DSL.*;

这将使上面的代码编译。 但是,这样的Select语句并不能做很多事情,它只是放在那儿,可以打印到控制台上:

System.out.println(select  (AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).from   (AUTHOR).orderBy(AUTHOR.ID)
);

上面将打印:

select "PUBLIC"."AUTHOR"."FIRST_NAME", "PUBLIC"."AUTHOR"."LAST_NAME" from "PUBLIC"."AUTHOR" order by "PUBLIC"."AUTHOR"."ID" asc

执行这样的查询非常简单。 我们需要做的就是为其提供JDBC Connection ,然后在其上调用fetch()

DSL.using(connection).select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).from(AUTHOR).orderBy(AUTHOR.ID).fetch();

注意,当然,您也可以将对象分配给局部变量,或者使用Spring或您喜欢的配置框架来配置它,而不是一直重复DSL.using(...)

DSLContext dsl = DSL.using(connection);dsl.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).from(AUTHOR).orderBy(AUTHOR.ID).fetch();

jOOQ将在内部创建一个新的JDBC PreparedStatement ,执行它,使用JDBC ResultSet ,并急切地关闭它创建的所有资源。 结果对象是Result ,它也实现了一个非常有用的toString()方法:

System.out.println(dsl.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).from(AUTHOR).orderBy(AUTHOR.ID).fetch()
);

以上将产生:

+----------+---------+
|FIRST_NAME|LAST_NAME|
+----------+---------+
|George    |Orwell   |
|Paulo     |Coelho   |
+----------+---------+

3.其他语句类型

jOOQ本机支持每个DML SQL语句(以及一些DDL SQL语句),包括SELECTUPDATEINSERTDELETEMERGE 。 如果我们要创建,更新,删除新的AUTHOR记录,则可以编写以下SQL语句:

dsl.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).values(3, "Alfred", "Hitchcock").execute();

请注意,我们现在将调用execute()而不是fetch() execute() ,它返回受影响的行数。

上面查询的一个有趣的方面是jOOQ使用很多Java泛型来确保查询中的类型安全。 例如,以下两个查询将产生编译错误:

dsl.insertInto(AUTHOR, AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).values(3, "Alfred")
// ^^^^^^^ values() expects three arguments (for ID, FIRST_NAME, LAST_NAME),
//                  but only two were provided!.execute()

这非常强大,因为您将永远不会忘记根据INTO子句的要求向VALUES子句添加相等数量的值。 这也扩展到类型不匹配。 如果您决定对INTO子句中的列进行重新排序,但忘了改写VALUES子句,则您的Java编译器可能会再次抱怨。 以下内容无法编译:

dsl.insertInto(AUTHOR, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, AUTHOR.ID).values(4, "Alfred", "Hitchcock")
// ^^^^^^^ values() expects arguments of type (String, String, Integer),but (Integer, String, String) was provided!.execute()

更新

UPDATE语句与前面的语句一样简单:

dsl.update(AUTHOR).set(AUTHOR.DATE_OF_BIRTH, Date.valueOf("1899-08-13")).where(AUTHOR.ID.eq(3)).execute()

到目前为止,选择ID = 3的作者将产生完整的AUTHOR记录:

dsl.select().from(AUTHOR).where(AUTHOR.ID.eq(3)).fetch()

……屈服

+----+----------+---------+-------------+
|  ID|FIRST_NAME|LAST_NAME|DATE_OF_BIRTH|
+----+----------+---------+-------------+
|   3|Alfred    |Hitchcock|1899-08-13   |
+----+----------+---------+-------------+

删除

最后但并非最不重要的一点是, DELETE语句如下:

dsl.delete(AUTHOR).where(AUTHOR.ID.eq(3)).execute()

4.谓词

谓词是SQL(尤其是动态SQL)的重要方面。 SQL知道各种谓词,例如:

日常谓词

  • 比较谓词
  • NULL谓词
  • 像谓词
  • IN谓词
  • 存在谓词

更高级的谓词

  • 量化比较谓词
  • DISTINCT谓词
  • 谓词之间
  • 重叠谓词

同样,在SQL中,可以使用ANDOR轻松组合谓词。 jOOQ以一种流利的方式直接在列类型上反映了所有这些谓词。 最好通过示例解释:

比较谓词

// A filtering predicate
AUTHOR.ID.eq(3);// A join predicate
AUTHOR.ID.eq(BOOK.AUTHOR_ID);

这些谓词中的大多数也都是类型安全的,例如,您不能将数字与字符串进行比较。

AUTHOR.ID.eq("abc");
//        ^^ Compilation error. An expression of type Integer is expected
//           (or Field<Integer>, or Select<? extends Record1<Integer>>)

IN谓词是类型安全的一个有趣案例,它需要一个值列表或一个在IN关键字右侧仅包含一列的子查询:

// IN list
AUTHOR.ID.in(1, 2, 3);// IN with subquery
AUTHOR.ID.in(select(BOOK.AUTHOR_ID).from(BOOK))

第二个示例在AUTHOR表和BOOK表之间执行半AUTHOR ,仅返回至少写过一本书的作者。 由于使用Java泛型,因此以下查询将无法编译:

// IN list with wrong types
AUTHOR.ID.in("a", "b", "c");
//           ^^^^^^^^^^^^^ This in() method expects an Integer... argument// IN with subquery returning wrong type
AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK))
//           ^^^^^^^^^^^^^^^^^^ This in() method expects a   Select<? extends Record1<Integer>>
//

另外,以下(无效)语句将被Java编译器拒绝:

AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.TITLE).from(BOOK))
//        ^^ This in() method expects a   Select<? extends Record1<Integer>>,
//           but instead, an incompatible Select<Record2<Integer, String>> was provided

5.列表达式

在SQL中,您可以通过对列表达式应用函数或操作来创建新型的列表达式。 例如,您可以串联作者的名字和姓氏:

在SQL中:

SELECT   author.first_name || ' ' || author.last_name
FROM     author
ORDER BY author.id

使用jOOQ ::

dsl.select(concat(AUTHOR.FIRST_NAME, val(" "), AUTHOR.LAST_NAME)).from(AUTHOR).orderBy(AUTHOR.ID).fetch()

请记住,我们是从DSL静态导入所有内容,包括DSL.concat()DSL.val()

dsl.select(AUTHOR.FIRST_NAME.concat(" ").concat(AUTHOR.LAST_NAME)).from(AUTHOR).orderBy(AUTHOR.ID).fetch()

当然,由于Java不允许运算符重载(或符号方法名称),因此我们必须处理常规方法名称,在这种情况下,应使用concat 。 通常是由您决定要对函数使用前缀符号,还是对运算符使用前缀符号。

6.有关jOOQ DSL的更多信息

jOOQ DSL具有非常丰富的功能。 列出本课程中的所有功能将重复参考手册。 请考虑手册中有关SQL构建的部分,以了解有关jOOQ DSL的更多信息。

翻译自: https://www.javacodegeeks.com/2015/09/work-with-the-jooq-dsl.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Noip模拟赛] Power

POWER 源程序名 POWER.??? (PAS,C,CPP) 可执行文件名 POWER.EXE 输入文件名 POWER.IN 输出文件名 POWER.OUT 多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。 多瑞卡每晚到早晨5点钟都在晚会上&a…

如何玩转CSS列表样式?速查!

目录 CSS 列表 列表 不同的列表项标记 作为列表项标记的图像 浏览器兼容性解决方案 列表 -简写属性

linux逆向工程反汇编,Kali Linux 逆向工程工具 Jad 教程

日期&#xff1a;2017年12月21日观看&#xff1a; 1,895 C 次用法&#xff1a;jad [option(s)] jad [选项(s)] 选项&#xff1a;-a - 生成JVM指令作为注释(注释)-af - 注释时输出完全限定的名称-b - 生成冗余大括号(大括号)-clear - 清除所有的前缀&#xff0c;包括默认的前缀-…

任意文件读取及删除漏洞

任意文件读取漏洞及危害 通过提交专门设计的输入&#xff0c;攻击者就可以在被访问的文件系统中读取或写入任意内容&#xff0c;往往能够使攻击者从服务器上获取敏感信息文件&#xff0c;正常读取的文件没有经过校验或者不严格&#xff0c;用户可以控制这个变量读取任意文件。…

restful web_RESTful Web服务可发现性,第4部分

restful web这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web Service的系列文章的第四篇 。 本文将重点介绍REST API&#xff0c;HATEOAS的可发现性以及由测试驱动的实际方案。 引入REST可发现性 API的可发现性是一个值得引起足够关注的…

微信小程序微信支付安卓手机可以,苹果手机支付失败。

问题截图: 解决办法有3种可能性,请按照对应的情况排查: 1.wx.request 无法发起网络请求,提示没有权限,域名已经配置过了,证书检测也是正确没问题的? 测试ios和安卓,假如有一方可以,一方不行,则是证书问题,请选用受认可的证书 检测地址:https://www.qcloud.co…

面试知识点总结01

1.Android 版本Bug 想必使用过 Android 5.0.1 系统的用户对内存泄露 bug 不会感到陌生&#xff0c;此缺陷不仅会导致内存占用过高&#xff0c;还会进而致使应用及其后台进程被强制关闭&#xff0c;甚至是系统界面崩溃等。 内存泄露 信息泄露 流量泄露 2.ArrayList 和LinkList的…

安装linux无驱动黑屏,ubuntu16.04安装黑屏与显卡安装笔记

本帖最后由 zhengchao666 于 2016-4-26 16:08 编辑ubuntu安装时黑屏处理问题描述&#xff1a;ubuntu使用光盘/USB安装时&#xff0c;出现"install ubuntu/ try ubuntu without installation"选择&#xff0c;但是Enter安装时&#xff0c;显示器显示没有信息&#xff…

从JS敏感信息泄露到GETSHELL

前言 小弟新手&#xff0c;大佬勿喷&#xff0c;文章有何不妥&#xff0c;还望大佬们斧正。 正文 前端时间打HW&#xff0c;拿到一个IP&#xff0c;先在FOFA上搜一下 发现这个IP现在开放了三个端口&#xff0c;分别是86&#xff0c;83&#xff0c;82对应不同的后台管理系统 …

HashMap两种遍历数据的方式

HashMap的遍历有两种方式&#xff0c;一种是entrySet的方式&#xff0c;另外一种是keySet的方式。 第一种利用entrySet的方式&#xff1a; Map map new HashMap(); Iterator iter map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry (Map.Entry) iter.ne…

jOOQ类型安全数据库查询教程

课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自从JDBC以来&#xff0c;几乎没有采取任何相关的措施来更好地将SQL集成到Java中。 在更高级别上…

中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程

计算机原理、计算机应用基础、计算机网络基础、CAD辅助设计、三维动画设计、VBSIC语言及程序设计PHOTOSHOP、Windows、网页设计、Office办公自动化、多媒体、计算机系统安装及维护管理、计算机病毒原理防范等。计算机专业就业前景计算机专业就业前景很好。随着现代经济和科技的…

教你玩转CSS表格(table)

目录 表格边框 折叠边框 表格宽度和高度 表格文字对齐 表格填充 表格颜色 表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框: table, th, td {border: 1px solid black;}

实战|全程分析js到getshell

本篇转载于https://forum.butian.net/share/260 看到望海师傅的山理证书真滴好看&#xff0c;真想搞一本&#xff0c;刚刚入edusrc的时候收集了一波山理的子域资产&#xff0c;全部看了一遍都被大佬挖的干干净净了。没有内网VPN基本上挖不到&#xff0c;然后我就去公众号看了一…

教你吃透CSS的盒子模型(Box Model)

目录 CSS 盒子模型(Box Model) 元素的宽度和高度 浏览器的兼容性问题 CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,”box model”这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容…

多家防火墙设备存在信息泄露漏洞

概述 漏洞名称多家防火墙设备存在信息泄露漏洞安全通告发布日期2021-06-16受影响产品及版本胜鑫塔下一代防火墙XT6000-A-FW-1.0.0-0-2778 利谱第二代防火墙6164-1.5.2 任子行下一代防火墙SURF-NGSA-V-3000 中科网威下一代防火墙F6600L-1.5.2 任子行网络安全审计系统内置报表 网…

c语言 linker error,[Linker error] undefined reference to `prinf'的问题!

[Linker error] undefined reference to prinf的问题&#xff01;环境为dev-cpp日志如下&#xff1a;编译器: Default compiler执行 gcc.exe...gcc.exe "E:\C\ran.c" -o "E:\C\ran.exe" -I"D:\Dev-Cpp\include" -L"D:\Dev-Cpp\lib"C:\…

独处可以激发思考的力量

如果你知道怎么独处的话&#xff0c;成大事者都是善于独处的人&#xff0d;&#xff0d;在独处的过程中激发思考的力量。 自卑可以像一座大山把人压倒并让你永远沉默&#xff0c;也可以像推进器产生强大的动力。 比别人先走一步&#xff0c;能创造一种成功的心境。 在独处时&am…

教你玩转CSS border(边框)

目录 边框样式 border-style 值 边框宽度 边框颜色 边框-单独设置各边 实例 边框-简写属性 CSS 边框属性

从命令式功能到纯功能性,然后再返回:Monads与范围内的延续

这则影片随附此文章&#xff0c;没有它不会有太大意义 上个月&#xff0c;我在Curry On会议上做了演讲&#xff0c;该会议是与学术&#xff0c;编程语言会议ECOOP共同举办的新会议。 Curry On旨在弥合学术界之间的鸿沟。 我的学术兴趣不包括编程语言&#xff0c;我认为编程语言…