【问题标题】:JPA or JDBC, how are they different?JPA 或 JDBC,它们有何不同?
【发布时间】:2012-08-06 13:38:23
【问题描述】:

我正在学习 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 差异让我找到了一些充满“术语”的网站,我无法理解:(

【问题讨论】:

标签: java jpa jdbc


【解决方案1】:

通俗地说:

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

JDBC 是直接连接到数据库并针对它运行 SQL 的标准 - 例如 SELECT * FROM USERS 等。可以返回您可以在应用程序中处理的数据集,并且您可以执行所有常见的操作,例如 @987654323 @、DELETE、运行存储过程等。它是大多数 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 就是这样一个例子
  • true DataNucleus.. 甚至还有一些用于 excel 等的 - 最初的问题是 JDBC/JPA,所以我正确或错误地认为他对关系存储感兴趣。
  • Wikipedia (MyBatis):“与 ORM 框架不同,MyBatis 不会将 Java 对象映射到数据库表,而是将 Java 方法映射到 SQL 语句。”
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      JDBC 是 JPA 的前身。

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

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

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

      【讨论】:

      • "没有 Java EE 容器??"您的意思是 Spring 及其库独立于 Web 容器吗?
      • @BruceZu 当然是。您可以使用许多 Spring 框架组件,而无需 Web 容器。例如,依赖注入不仅仅需要在 Web 上下文中。
      • @Dolfiz 不是 Java Web 和 Java EE 库的包装器吗?
      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多