JDBC、JOOQ 与 Hibernate 三者如何选择?

 Java持久层目前有以下几种选择:

  • 普通的老式 JDBC:手动编写 SQL 查询,手动解析结果
  • Hibernate / JPA / ORM++:编写自动转换为 SQL 查询的 Java 代码,自动将结果解析为 POJO,自动将 POJO 更新为 DB。
  • 两者之间:手动编写 SQL 查询,但自动将结果解析为 POJO,POJO 只是 POJO,它们根本没有连到数据库的链接。
  • jOOQ :它只进行必要的最低抽象级别,并提供真正出色的查询构建器 DSL。使用 Oracle 或 MS SQL Server,需要支付一定费用才能使用 JOOQ
  • Mybatis是一个持久化框架,而不是一个orm:Mybatis 并不将表映射到类,而是将 SQL 映射到方法。
  • 使用 JDBI:JDBI 与 JDBC是相同的,但在映射 POJO 和进行良好的转换方面具有一些智能,并且总体上具有更好的 API。

以下是Reddit网友的评论:

1、Hibernate是一个具有太多魔力的解决方案:

  • 它往往会创建笨拙的、低性能的 SQL 代码,
  • 它将实体附加到会话并在事务提交时自动保留它们
  • 它使用荒谬的方法在单个查询中一次获取整个世界
  • createNativeQuery 是可以想象到的最愚蠢的 API,它似乎几乎无法将 SQL 结果集放入 Object[] 中,其中的类型是为存储在其中的每一列选取的随机且与版本相关的类型。

Hibernate优点是从 Java POJO 生成数据库。尽管支持不完整并且生成的表通常具有尴尬的字段命名并且缺乏适当的外键索引。不过,有总比没有好。

2、jOOQ太慢
在部署方面,我真的不想从数据库表转到生成的 jOOQ 风格的 Java 类,因为这意味着部署时数据库必须与当前的生产数据库匹配,因为这些类是在部署环境中生成的,然后再进行部署。如果您不小心维护构建主机上的所有相关数据库环境以使其正确,则很可能会意外地与生产表发生冲突。

3、JDBI:
采用单一事实来源(JAR 文件),将其转储到计算机中,启动它,并让它根据自己的喜好自动修复数据库(如果可能的话)。JDBI 非常好用,可以轻松进行复杂的投影并将其映射到反映单一应用程序视图需求的结果集。

4、JDBC:
使用 Java 访问数据库,必须始终使用 JDBC。
所有其他数据库/框架都只是 JDBC 之上的抽象。您很快就会发现,Java 开发人员非常喜欢在数据库之上堆积多少个抽象层。常见的堆栈是 JDBC + JPA + Spring Data,并带有 Hikari 或类似的连接池库以达到良好的效果。
如果您使用 JPA/Hibernate,请记住它的主要作用是将结果集转换为 Java 对象。它还充当插入和更新的助手。它绝对不是 SQL 生成器,也不应该被用作 SQL 生成器。对于只读查询,您应该编写带有 DTO 投影的 HQL 或本机 SQL(Hibernate 手册甚至这么说)。
您放入实体中的所有映射仅用于帮助插入和更新。即使对于那些关系映射并不总是那么有帮助,并且可能会导致性能问题,并且很多时候最好只是使用其主键而不是实体关系手动映射关系。

5、 如果您只想轻松快速地完成基本的 CRUD 工作,那么 JDBC/Hibernate/Spring Data 就很棒。
一旦您确实需要编写一个执行更复杂操作的查询,只需将 JOOQ 添加到堆栈即可。