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 Connection
, PreparedStatement
和ResultSet
类的资源,这样就无需您自己去处理资源管理的麻烦。
再次:
jOOQ本质上是类型安全的JDBC。 而已。
出于各种原因,JDBC一直是Java EE应用程序的重要组成部分,包括对供应商特定功能的访问。 jOOQ在JDBC的基础上增加了编译时类型的安全性。 而已。 与JDBC兼容的任何东西都可以与jOOQ兼容。
特别是,无论您做出何种选择,jOOQ都不会干扰您的事务或会话模型。 jOOQ所需要的只是一个JDBC Connection
或DataSource
。
在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
java jooq_将Java EE与jOOQ结合使用的初学者指南相关推荐
- 将Java EE与jOOQ结合使用的初学者指南
Java EE附带了自己的持久性API:JPA. 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略. 其背后的想法是,业务逻辑通常并不像关系代数或S ...
- 浅谈Java SE、Java EE、Java ME三者的区别
1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...
- Java SE和Java EE应用的性能调优
凡事预则立,不预则废,和许多事情一样,Java性能调优的成功,离不开行动计划.方法或策略以及特定的领域背景知识.为了在Java性能调优工作中有所成就,你得超越"花似雾中看"的状态, ...
- JDK版本Java SE、Java EE、Java ME的区别
想在win7 X64上搭建JAVA开发环境来着(只是尝试下),打开JAVA 官网下载JDK,发现好多版本懵了,百度了下找到这些版本的区别,故有了下文 1.JAVA SE Java2平台标准版(Java ...
- Java SE、Java EE、Java ME基本区别
Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...
- java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用
java jsf 如果您将Java 8与Java EE 7一起使用,则在尝试利用某些Java 8新功能时可能会遇到一些怪癖. 一个这样的怪癖是,默认情况下,新的Date-Time API不适用于许多J ...
- Java SE、Java EE、Java ME三者的区别
说得简单点 Java SE 是做电脑上运行的软件. Java EE 是用来做网站的-(我们常见的JSP技术) Java ME 是做手机软件的. 1. Java SE(Java Platform,Sta ...
- Java SE到Java EE的学习转换
我接触java的学习是从Java SE开始的,SE部分主要是用来做桌面程序的开发,在现在的主流趋势中已经渐渐的退出了中心舞台.现在人们对网络的认知和通过网络接收信息大部分都是碎片化的,因此各种网页就成 ...
- 浅谈Java SE、Java EE、JME的关系
Java SE.Java EE.JME是Java的三个版本.他们的关系可以用下图表示 想要进一步认识他们的区别,我们先来看一下他们详细的英文名称 Java SE (Java Platform, Sta ...
最新文章
- R语言switch语句语法、实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题
- ocs(office communications server)通讯簿无法同步的问题集锦及解决方法
- ZooKeeper的API操作(二)(通俗易懂)
- Design Pattern - Interpreter(C#)
- python安装modify setup选哪-python 之禅 import this
- 《Total Commander:万能文件管理器》——第8.3节.张学思版预装的插件
- 大话云计算——认识云——“瑞友杯”虚拟化征文
- BZOJ1555 KD之死
- [ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件
- Vue010_ 过滤器
- ubuntu16.04+xfce4截图、终端调出、锁屏的快捷键设置、去掉Alt+鼠标移动屏幕的功能、安装thunar、小键盘问题、设置终端背景
- SpringBoot2.1.5(16)--- Spring Boot的日志详解
- CCIE学习(40)—— OSPF设计与LSA类型(三)
- Spring 学习一 @Autowired
- 细菌的天敌抗生素,如何利用这把救命的双刃剑?
- Spring Boot 中的 HttpClient 新贵 Retrofit !
- man查询括号中的数字含义
- ios-跳转到苹果自带地图进行导航
- Android调用系统分享和指定app分享-微信朋友圈图文分享和qq分享
- Python 架设网站