欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2023/12/3 70 豆豆
生活随笔 收集整理的这篇文章主要介绍了 将Java EE与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 EE与jOOQ结合使用的初学者指南的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。