java jooq_将Java EE与jOOQ结合使用的初学者指南

java jooq

Java EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的思想是,业务逻辑通常不像关系代数或SQL那样真正面向集合,而是面向记录的,这意味着将业务规则和业务逻辑应用于单个记录。

换句话说,当SQL和关系代数与值(元组)有关时,JPA与(单个记录的)身份和状态有关。 这就是JPA的亮点,因为:

寿命太短,无法使用SQL编写CRUD

但是正如加文·金(Gavin King)经常说的:

加文·金冬眠

RDBMS不仅仅与CRUD有关

加文·金(Gavin King)在开始研究最流行的JPA实现Hibernate时就已经意识到了OLAP的炒作。 商业智能或当今称为数据科学的技术比简单的CRUD依赖更高级的功能-简单的JPA规范或其实现从未将其作为目标。

实际上,您不必一定要执行OLAP才能从本机SQL中受益,在更普通的OLTP环境中也会出现更简单的用例,例如

  • 报告中
  • 批量和批量数据处理
  • 查询复杂的业务规则

尽管JPA提供了JPQL和Criteria API,它将帮助您表达查询中的一些复杂性,但是您最终将受到这些语言和API提供的功能的限制,正如Michael Simons最近在有趣的Criteria API与jOOQ比较中所记录的那样 。

因此,所有JPA实现都提供了一种使用“本地SQL”查询数据库的方法。 在先前的博客文章中,我们展示了如何利用jOOQ的类型安全DSL API通过JPA的本机查询API运行SQL查询 ,然后获取结果……

  • ……作为管理实体
  • …作为使用SqlResultSetMapping映射的DTO

在上述情况下,jOOQ仅用作SQL查询构建器 ,而查询执行则留给JPA。

在Java EE中使用jOOQ进行所有数据库查询

记住jOOQ的理念 :

jOOQ本质上是类型安全的JDBC。 而已。

即使可以使用JPA执行本机SQL,也不必这样做。 您可以直接在JDBC级别上进行操作,这是JPA经常需要执行的操作,例如在工作时…

  • ……具有特定于供应商的数据类型
  • ……使用非平凡的存储过程
  • …与语句批处理
  • …带有可更新的游标

在应用程序服务器上运行应用程序时,可以选择所需的功能,其余部分使用专有的API(例如在JDBC之上运行的jOOQ)。 例如,您可以使用:

  • 用于会话和范围管理的EJB
  • CDI用于依赖项注入
  • jOOQ与您的数据库交互

(您也可以将JTA添加到堆栈中-为简单起见,我们暂时将其跳过)

该过程很简单:只需使用CDI将javax.sql.DataSource注入到会话bean中即可:

@Stateless
public class LibraryEJB {@Resource(lookup="java:data-source-configuration")private DataSource ds;
}

…并开始使用JDBC进行操作:

public List<Author> fetchAuthors() 
throws SQLException {List<Author> result = new ArrayList<>();// Get a Connection from the injected DataSourcetry(Connection con = ds.getConnection();PreparedStatement stmt = con.prepareStatement("SELECT * FROM AUTHOR ORDER BY ID");ResultSet rs = stmt.executeQuery()) {result.add(new Author(rs.getInt("ID"),rs.getString("FIRST_NAME"),rs.getString("LAST_NAME")));}return result;
}

…或使用jOOQ:

public Result<AuthorRecord> fetchAuthors() {// Pass the injected DataSource to jOOQreturn DSL.using(ds, H2).selectFrom(AUTHOR).orderBy(AUTHOR.ID).fetch();
}

请注意,jOOQ (默认情况下)如何将所有结果急切地获取到内存中 ,并急切地关闭诸如JDBC ConnectionPreparedStatementResultSet类的资源,这样就无需您自己去处理资源管理的麻烦。

再次:

jOOQ本质上是类型安全的JDBC。 而已。

出于各种原因,JDBC一直是Java EE应用程序的重要组成部分,包括对供应商特定功能的访问。 jOOQ在JDBC的基础上增加了编译时类型的安全性。 而已。 与JDBC兼容的任何东西都可以与jOOQ兼容。

特别是,无论您做出何种选择,jOOQ都不会干扰您的事务或会话模型。 jOOQ所需要的只是一个JDBC ConnectionDataSource

在JBoss WildFly中运行示例

例如,可以从GitHub检出以上示例,然后直接在WildFly中运行-或在其他Java EE应用程序服务器中进行少量改动即可: https : //github.com/jOOQ/jOOQ/tree/master/jOOQ-examples / jOOQ-javaee-example

该示例是在与Arun Gupta举行的网络研讨会中为WildFly创建的。 网络研讨会回答以下问题:

  • 什么是jOOQ?
  • 有JDBC和JPA时为什么要使用JOOQ?
  • 它如何与Java EE应用程序配合? 它使用底层的JPA持久性提供程序还是其他一些连接?
  • 通过JPA的利弊? 纯冬眠?
  • 它的缩放程度如何?
  • 在Java EE应用程序中显示代码示例
  • jOOQ用于基于CRUD或领域丰富的应用程序?
  • 最终如何将jOOQ中的所有工作整合到JPA中并进行标准化? 还是更多的JDBC?

完整的网络研讨会可以在YouTube上找到,这里:

翻译自: https://www.javacodegeeks.com/2015/10/a-beginners-guide-to-using-java-ee-with-jooq.html

java jooq

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

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

相关文章

java ee编译器_Java EE 8 MVC:控制器的详细介绍

java ee编译器Java EE MVC是为Java EE 8计划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识&#xff0c;并展示了如何开始使用 Java EE 8 MVC参考实现Ozark 。 在本文中&#xff0c;我们将更详细地介绍MVC控制器…

php扩展 waf,基于PHP扩展的WAF实现

访问一下看看结果&#xff1a;可以看到ls命令成功的执行了&#xff0c;也就是说我们的正常文件是不会被拦截的&#xff0c;而只有upload目录中的文件会被拦截&#xff0c;这样做又会引发另一个弊端&#xff0c;倘若攻击者通过某种方法将shell写入正常的文件中&#xff0c;或是与…

junit4 集成测试_使用JUnit规则进行干净的集成测试

junit4 集成测试JUnit Rules的优势&#xff0c;尤其是在进行集成测试时&#xff0c;几乎不能被高估。 在本文中&#xff0c;我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下&#xff0c;这简化了灯具控制。 作为示例&#xff0c;我们将…

多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用。 多项式函数主要有&#xff1a; roots 求多项式的根 poly 特征多项式 polyval 多 项式的计算 poly2str(p, x )多项式代换 polyfit 多项式曲线…

java8 从数组获取流_从数组到流再到Java 8

java8 从数组获取流不久前&#xff0c;我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外&#xff0c;使用lambda和streams API &#xff0c;过滤&#xff0c;映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止&#xff0c;对于大多数人来说&a…

乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界

这是用PHP编写的魔兽世界服务器。现在它已经调试了登录服务器的过程。目前的魔兽世界客户端是2.4.3_8606。服务器列表和帐户密码数据需要查询AUTH库。世界服务器身份验证过程已完成&#xff0c;数据包加密已完成后续进程正在开发中......数据库文件在根目录: sql/sql.7z今天在群…

javafx窗体程序_JavaFX真实世界应用程序:EIZO CuratOR Caliop

javafx窗体程序JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同显示器的路由&#xff0c;录制视频&#xff0c;拍摄…

玫瑰花函数matlab,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼function plot_rosedraw_main(450,90);function draw_main(x,y)%粉红色玫瑰arcdata{1}[65 -60 150 350 866 -54 300 470 865 -56 30 230 1064 -57 300 490 17];ellipsedata{1}[73 -30 250 450 27 4059 -30 100 290 27 4065 -40 140…

java8 streams_Java 8 Streams:过滤和谓词否定

java8 streams最近&#xff0c;有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论&#xff0c;因此我认为值得在博客文章中进行总结。 讨论是关于使用.filter和否定谓词的方法。 这篇文章的代码可以在我的github帐户中找到 。 也许这就是您可能会想到的方式&…

python判断相同,Python判断两个文件是否相同与两个文本进行相同项筛选的方法

python判断两个文件是否相同import hashlibdef gethash(f):linef.readline()hashhashlib.md5()while(line):hash.update(line)linef.readline()return hash.hexdigest()def ishashequal(f1,f2):str1gethash(f1)str2gethash(f2)return str1str2if __name__ __main__:f1open(&qu…

hystrix熔断 简介_Hystrix简介– Hello World

hystrix熔断 简介在以前的博客文章中&#xff0c;我介绍了需要像Netflix Hystrix这样的库的动机。 在这里&#xff0c;我将跳入一些非常基本的方法来开始使用Hystrix&#xff0c;并在更复杂的用例中进行跟进。 你好&#xff0c;世界 以下是“ Hystrix命令”的一个简单的Hello …

php中哪个函数用于读取文件,PHP内置函数fget读取文件

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行&#xff0c;并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中&#xff0c;)&#xff0…

c++返回指针时候注意提防_提防Java中的函数式编程!

c返回指针时候注意提防这对函数式编程并不会造成太大的影响&#xff0c;这真棒。 这是关于某些实践的警告&#xff0c;您很可能会将其应用于您的代码&#xff0c;而这是完全错误的&#xff01; 。 高阶函数对于函数式编程是必不可少的&#xff0c;因此&#xff0c;谈论它们将帮…

centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

|CentOS环境下给PHP7.0安装yaf扩展在CentOS环境下给PHP7.0安装yaf扩展&#xff0c;首先要知道PHP的安装目录在哪里&#xff0c;以我当前的路径为例&#xff0c;在/usr/local/php目录下。下一步需要下载扩展包&#xff0c;进入http://pecl.php.net/package/yaf寻找符合版本要求的…

linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性&#xff0c;无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性&#xff0c;所以需要修改配置文件并重新编译linux内核&#xff0c;然后就开始了漫长的linux内核编译过程&#xff0c;幸好有个大神帮…

jsf教程_JSF范围教程– JSF / CDI会话范围

jsf教程会话作用域跨越多个HTTP请求-响应周期&#xff08;理论上是无限的&#xff09;。 当您需要每个HTTP请求-响应周期进行一次交互时&#xff0c;请求作用域在任何Web应用程序中都非常有用。 但是&#xff0c;当您需要对属于用户会话的任何HTTP请求-响应周期可见的对象时&…

linux查询设备文件信息失败怎么办,Linux下使用blkid命令查询设备及文件系统信息的方法...

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。直接使用blkid可列出当前系统中所以已挂载文件系统的类型。默认情…

将MongoDB集成到您的Spring项目中

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

linux 内存一直在增加,linux – 缓存内存和共享内存总和超过总内...

所有共享内存也计为缓存.共享内存是在内部使用tmpfs实现的. tmpfs实现为页面缓存的瘦包装器,只是没有任何后备存储(除了tmpfs是可交换的).男人自由不解释这个.至少在我的系统上(由procps-ng提供,最后更新2016-06-03).抱歉.所有man free告诉你,缓存是从/ proc / meminfo中的缓存…

vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...

vertx rest 跨域我是Vert.x的新手&#xff0c;但作为Java开发人员&#xff08;辛勤工作&#xff09;&#xff0c;与NodeJS或其他任何基于Reactor的框架/库相比&#xff0c;我觉得它更加有趣并且很有前途。 因此&#xff0c;我正在使用Vert.x实现一个非常简单的Restful API。 今…