Java访问数据库的不同方式

k13*_*13i 2 java database hql jpql criteria-api

有很多技术可以使用 Java 访问数据。我正在阅读其中一些,包括:

  • JPQL
  • 高品质
  • 标准API
  • 查询dsl
  • 约克
  • 贾曲
  • JDBC
  • 活动JDBC

现在我真的很困惑,因为开销很大。这些技术之间的主要区别和相似之处是什么?哪些是最常用的?简短的比较非常受欢迎。

Edw*_*uck 5

Java 中数据库访问的基本基础是 JDBC。它是一个接口(无实现),允许数据库供应商以标准方式公开他们的数据库,因此 Java 程序员不必从根本上改变他们的代码来支持不同的关系数据库。

也就是说,它接受 SQL,并且 SQL 是标准的,有很多变体,标准不允许跨数据库可移植性。

其余平台倾向于建立在 JDBC 之上,以试图降低与其他数据库集成的成本。与数据库交互的方式多种多样,基本上您可以在发出 SQL 命令时得到改进,或者附加库为您编写兼容的 SQL 命令。

两大类是“类数据库”和“对象存储”,其中对象存储专注于存储 Java 对象,而库负责 SQL 生成的大部分细节。

Technology                 / query language / type         / notes

Java Persistance API       / JPQL           / object store / not an implementation, but an interface allowing multiple implementations, query language is not table specific, but object specific
Hibernate                  / HQL            / object store / a popular Java solution, but tied to Hibernate only.
Java Persistance API       / Criteria API   / object store / Criteria API is the code (programming) equivalent to the JPQL strings.
Java Persistance API & JDO / QueryDSL API   / object store / Java API to build queries similar to Criteria API, but different
JDBC                       / jOOQ           / direct JDBC  / Java API that replaces SQL strings construction with method calls that are table centric
H2 database                / JaQu           / object store / Linked directly to one database, non-portable.  Follows Microsoft LINQ syntax.
JDBC                       / ActiveJDBC     / object store / Looks like a branded version of almost-JPA for webapps.  
Run Code Online (Sandbox Code Playgroud)

这个领域的两个基本 API 是 JDBC 和 JDO,如果您只打算支持关系数据库,那么您希望使用的 JDO 子集是 JPA。JDBC 和 JDO 都不直接提供数据库连接,它们是纯 API。也就是说,许多数据库供应商推出了不利用这些技术的 API,我建议不要使用任何不基于 JDBC 和 JPA 的技术。

再次利用多个实现,我还建议您不要使用不基于 JPQL(如果您在字符串中构建查询)或 CriteriaAPI(如果您在代码中构建查询)的查询语言,这两者都是JPA。如果您直接使用 JDBC,请对所有已发布的 SQL 使用 PreparedStatements,并记住,虽然您可以将现有 SQL 代码库与纯 JDBC 解决方案结合使用,但您可能会获得更好的实现质量(并且可能会更快地交付)使用 JPA,因为在将关系数据库映射到 Java 时有很多极端情况,很少有现有的数据库代码库可以处理这些情况。