JPA或JDBC,它们有何不同?


119

我正在学习Java EE,并且下载了带有glassfish的日食。我看到了一些示例,还阅读了Oracle文档,以全面了解Java EE5。连接到数据库非常简单。我打开了一个动态Web项目,创建了一个会话EJB,我使用EntityManager并通过get方法可以访问存储的数据表。

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

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

我如何了解JPA和与JDBC相关的持久性?JPA的目的是什么?为什么会有set / get方法?有人可以阐明这两者的本质吗?没有“行话”的利弊是什么?还请提出一些链接。一个简单的Google搜索JPA和JDBC差异使我进入了一些无法理解的充满“术语”的网站:(



2
JPA可以在没有EJB甚至Java EE的情况下使用,您可以直接从Persistence创建EntityManagerFactory。
詹姆斯

Answers:


237

用外行的话来说:

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

JDBC是用于连接到数据库直接和运行SQL反对标准-例如SELECT * FROM USERS,等可以返回的数据集,你可以在你的应用程序处理,你可以做所有常用的东西一样INSERTDELETE运行存储过程等它是大多数Java数据库访问(包括JPA提供程序)背后的基础技术之一。

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

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

其他示例包括OpenJPA,toplink等。

在后台,Hibernate和大多数其他JPA提供程序编写了SQL,并使用JDBC在数据库之间进行读写。


3
iBatis(如今为MyBatis)不是JPA实现。如果您看一下它,您会发现它确实有非常不同的概念。
米科·毛努

谢谢!我的错误,我认为它实现了JPA,现在已纠正!
Mark D

3
并非所有的JPA提供程序都编写SQL并使用JDBC ...,因为它们可能会持久存在“不同类型的数据存储区”(MongoDB,Neo4j等)。DataNucleus将JPA就是这样一个例子
DataNucleus将

真正的DataNucleus ..甚至还有一些针对excel的东西,等等-最初的问题是JDBC / JPA,所以我对或错认为他对关系存储感兴趣。
Mark D

52

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

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


20

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

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


10

JDBC是JPA的前身。

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

因此,JPA为您创建更新查询,并管理您查找或创建/更新的实体(它还会执行更多操作)。

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


“没有Java EE容器?” 您是说Spring及其库独立于Web容器吗?
Bruce Zu

@BruceZu当然是。您可以使用许多Spring框架组件,而无需Web容器。例如,依赖注入并不是仅在Web上下文中需要的东西。
Dolfiz

1
@Dolfiz是不是Spring Web库是Java Web和Java EE库的包装器?
raikumardipak '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.