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查询 ,然后获取结果……

在上述情况下,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 DataSource
    try(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 jOOQ
    return 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值