ChatGPT解决这个技术问题 Extra ChatGPT

JPA 或 JDBC,它们有何不同?

我正在学习 Java EE,我用 glassfish 下载了同样的 Eclipse。我看到了一些示例,还阅读了 Oracle 文档以了解有关 Java EE 5 的所有信息。连接到数据库非常简单。我打开了一个动态 Web 项目,创建了一个会话 EJB ,我使用了 EntityManager 并使用 get 方法可以访问存储的数据表。

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

我被要求通过“JDBC”方式。我遇到的第一个问题是连接到数据库。看来这一切都必须是硬编码的。我有一个persistence.xml,我可以使用它轻松配置数据库连接。甚至为数据库设置驱动程序也很容易。 JDBC 中也没有用于访问表实体的 get/set 方法。

我如何理解与 JDBC 相关的 JPA 和持久性? JPA 的初衷是什么?为什么有 set/get 方法?有人可以阐明这两者的本质以及没有“行话”的利弊吗?还请建议一些链接。一个简单的谷歌搜索 JPA 和 JDBC 差异让我找到了一些充满“术语”的网站,我无法理解:(

为什么不从 JDBC 教程开始:docs.oracle.com/javase/tutorial/jdbc/index.html
JPA 可以在没有 EJB 甚至 Java EE 的情况下使用,您可以直接从 Persistence 创建一个 EntityManagerFactory。

M
Matthias Braun

通俗地说:

JDBC 是数据库访问的标准

JPA 是 ORM 的标准

JDBC 是直接连接到数据库并针对它运行 SQL 的标准 - 例如 SELECT * FROM USERS 等。可以返回您可以在应用程序中处理的数据集,并且您可以执行所有常见操作,例如 INSERT、{ 3}、运行存储过程等。它是大多数Java数据库访问(包括JPA提供者)背后的底层技术之一。

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

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

其他示例包括 OpenJPA、toplink 等。

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


iBatis(现在是 MyBatis)不是 JPA 实现。如果你看一下它,你会发现它确实有非常不同的概念。
谢谢!我的错误,我以为它实现了 JPA,现在更正了!
并非所有 JPA 提供程序都编写 SQL 并使用 JDBC ......因为它们可能会持久保存到“不同类型的数据存储”(MongoDB、Neo4j 等)。 DataNucleus JPA 就是这样一个例子
真正的 DataNucleus .. 甚至还有一些用于 excel 等的 - 最初的问题是 JDBC/JPA,所以我正确或错误地假设他对关系存储感兴趣。
Wikipedia (MyBatis):“与 ORM 框架不同,MyBatis 不会将 Java 对象映射到数据库表,而是将 Java 方法映射到 SQL 语句。”
W
Wolfgang Fahl

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

JDBC 是与数据库交互的低级标准。 JPA 是用于相同目的的更高级别的标准。 JPA 允许您在应用程序中使用对象模型,这可以让您的生活更轻松。 JDBC 允许您直接对数据库执行更多操作,但需要更多注意。有些任务使用 JPA 无法有效解决,但使用 JDBC 可能会更有效地解决。


p
pap

JDBC 是比 JPA 低得多(且更早)的规范。就其本质而言,JDBC 是一种使用纯 SQL 与数据库交互的 API——发送查询和检索结果。它没有对象或层次结构的概念。使用 JDBC 时,您可以将结果集(本质上是一个或多个数据库表中的值的行/列矩阵,由 SQL 查询返回)转换为 Java 对象。

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


A
Arjan Tijms

JDBC 是 JPA 的前身。

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

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

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


“没有 Java EE 容器??”您的意思是 Spring 及其库独立于 Web 容器吗?
@BruceZu 当然是。您可以使用许多 Spring 框架组件,而无需 Web 容器。例如,依赖注入不仅仅是在 Web 上下文中需要的东西。
@Dolfiz 不是 Spring Web 库是 Java Web 和 Java EE 库的包装器吗?
S
Sanket Goti

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

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

hibernate 是 JPA hibernate 的实现,您可以从此处查看有关 jpa Query 的更多详细信息


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center