java - Java访问数据库的不同方式

标签 java database hql jpql criteria-api

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

  • JPQL
  • 总部
  • 标准 API
  • 查询dsl
  • jOOQ
  • 贾曲
  • JDBC
  • ActiveJDBC

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

最佳答案

Java 中数据库访问的基础是 JDBC。它是一个接口(interface)(无实现),允许数据库供应商以标准方式公开他们的数据库,因此 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.  

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

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

关于java - Java访问数据库的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42236021/

相关文章:

MySQL查询从不同列中查找数据并在线离线查看

PHP多个复选框到数据库

java - java中如何将给定的日期转换为年,月,日

java - 如何使用 Java 8 按某些标准检查集合中的值是否唯一

MySQL - 1 列表

java - 在 HQL (Hibernate) 中转换 SQL 查询

regex - Hadoop拆分/正则表达式

Hibernate 查询语言中的 MySql date_sub() 函数并查找上周日期范围

java - 递归打印方法

java - 当我通过 JPA 运行查询时出现 MissingTokenException