JPA 或 JDBC,它们有什么不同?

我正在学习 JavaEE,我下载了与 glassfish 相同的 Eclipse。我看到了一些示例,也阅读了 Oracle 文档,了解了 JavaEE5的所有内容。连接到数据库非常简单。我打开了一个动态 Web 项目,创建了一个会话 EJB,我使用 EntityManager 和 get 方法可以访问存储的数据表。

对于我的下一个项目,我创建了一个简单的类,然后访问一些数据库表。我遇到的第一个问题是 PersisenceUnit 属性只能被 EJB、 Servlet 等识别,而不是一个简单的 Java 类。因此,我不能使用 EntityManager 方式(或者我可以吗?)

我被要求通过“ JDBC”的方式进行。我遇到的第一个问题是获取到数据库的连接。看来这些都是硬编码的。我有一个尾端可以用来轻松配置数据库连接的尾端。甚至为 DB 设置一个驱动程序也很容易。此外,JDBC 中没有用于访问表实体的 get/set 方法。

我如何理解 JPA 和持久性与 JDBC 的关系?JPA 是怎么想的?为什么有 set/get 方法?有人能解释一下这两者的本质吗? 如果没有“术语”,它们的优缺点是什么?也请建议一些链接。在谷歌上搜索一下 JPA 和 JDBC 的不同之处,我就找到了一些满是我无法理解的“术语”的网站:

153307 次浏览

JPA 和 JDBC 的主要区别在于抽象级别。

JDBC 是与数据库交互的低级标准。为了同样的目的,JPA 是更高级别的标准。JPA 允许您在应用程序中使用对象模型,这可以使您的生活更加轻松。JDBC 允许您直接使用数据库做更多的事情,但是它需要更多的关注。有些任务不能通过 JPA 有效地解决,但是可以通过 JDBC 更有效地解决。

用外行的话说:

  • JDBC 是数据库访问的标准
  • JPA 是 ORM 的标准

JDBC 是直接连接到数据库并在其上运行 SQL 的标准,例如 SELECT * FROM USERS等。数据集可以返回,您可以在您的应用程序中处理,并且您可以做所有常见的事情,如 INSERTDELETE,运行存储过程等。它是大多数 Java 数据库访问(包括 JPA 提供程序)背后的基础技术之一。

传统 JDBC 应用程序的一个问题是,您经常会有一些蹩脚的代码,其中会出现大量数据集和对象之间的映射,逻辑与 SQL 等混合在一起。

JPA 是对象关系映射的标准。这种技术允许您在代码和数据库表中的对象之间进行映射。这可以对开发人员“隐藏”SQL,以便他们所处理的都是 Java 类,而提供程序允许您保存它们并神奇地加载它们。通常,关于 getter 和 setter 的 XML 映射文件或注释可以用来告诉 JPA 提供程序对象中的哪些字段映射到 DB 中的哪些字段。最著名的 JPA 提供程序是 冬眠,因此这是一个很好的开始具体示例的地方。

其他的例子包括 OpenJPA,toplink 等等。

在底层,Hibernate 和大多数其他 JPA 提供程序编写 SQL,并使用 JDBC 来读取和写入数据库。

JDBC 是 JPA 的前身。

JDBC 是 Java 世界和数据库世界之间的桥梁。在 JDBC 中,您需要公开 CRUD 操作所需的所有脏细节,比如表名、列名,而在 JPA (下面使用 JDBC)中,您还需要指定数据库元数据的那些细节,但是要使用 Java 注释。

因此,JPA 为您创建更新查询,并管理您查找或创建/更新的实体(它也可以做得更多)。

如果您想在没有 JavaEE 容器的情况下执行 JPA,那么 Spring 及其库可以与相同的 Java 注释一起使用。

JDBC 是一个比 JPA 低级(且更老)的规范。在其基本要素中,JDBC 是一个用于使用纯 SQL 发送查询和检索结果与数据库交互的 API。它没有对象或层次结构的概念。在使用 JDBC 时,需要由您将结果集(本质上是由一个或多个数据库表中的值组成的行/列矩阵,由 SQL 查询返回)转换为 Java 对象。

现在,为了理解和使用 JDBC,您必须具备一些 SQL 的理解和工作知识。随之而来的还有对关系数据库是什么、如何使用它以及诸如表、列、键和关系等概念的深入了解。除非您至少对数据库、 SQL 和数据建模有一个基本的了解,否则您将无法充分利用 JDBC,因为它实际上只是这些东西之上的一个很薄的抽象。

JPA 和 JDBC 之间的差异通常是决定因素,因为这两种数据库技术使用非常不同的方法处理持久数据。JDBC,允许开发人员利用面向对象语义构造数据库驱动的 Java 程序

JPA 是与数据库无关的,这意味着相同的代码可以在很少修改的情况下用于各种数据库。JPA 作为一个抽象层,对开发人员隐藏低级 JDBC 调用,使数据库编码变得相当容易

Hibernate 是 JPA 的实现 Hibernate 您可以从这里看到关于 jpa Query 的更多细节

JDBC 是特定于供应商的关系数据库驱动程序之上的一个抽象层。如果没有 JDBC,您将不得不处理特定数据库的特性(没有多少乐趣)。然而,JDBC 级别太低,需要大量样板代码。

JPA 是 ORM 的规范(只是一个接口) ,没有实现是没有用的。

ORM 是一种关于从关系数据库中保存和检索对象的框架。存在许多具有不同抽象级别的 ORM。其中一些需要手动编写 SQL。

一些 ORM 实现 JPA (例如 Hibernate 或 EclipseLink) ,其中的 大部分构建在 JDBC 之上。

这样的 ORM 提供了最高级别的抽象,以至于您几乎不必编写 SQL 查询。有些人喜欢基于 JPA 的 ORM (它们减少了样板文件) ,有些人讨厌(抽象是漏洞,规范过于复杂,而且有很多拐角的情况)。

Java 类比:

class ORM extends JDBC implements JPA {
}