JPA oder JDBC, wie unterscheiden sie sich?

119

Ich lerne Java EE und habe dafür die Eclipse mit Glassfish heruntergeladen. Ich habe einige Beispiele gesehen und auch die Oracle-Dokumente gelesen, um alles über Java EE 5 zu erfahren. Die Verbindung zu einer Datenbank war sehr einfach. Ich habe ein dynamisches Webprojekt geöffnet, eine Sitzungs-EJB erstellt, EntityManager verwendet und mit den get-Methoden auf die gespeicherte Datentabelle zugreifen können.

Für mein nächstes Projekt hatte ich eine einfache Klasse erstellt und dann auf eine DB-Tabelle zugegriffen. Das allererste Problem, auf das ich stieß, war, dass das PersistenceUnit-Attribut nur von EJB, Servlet usw. erkannt wurde und nicht von einer einfachen Java-Klasse. Dann konnte ich den EntityManager-Weg nicht verwenden (oder kann ich?)

Ich wurde gebeten, den "JDBC" Weg zu gehen. Das allererste Problem, auf das ich stieß, war das Herstellen der Verbindung zur Datenbank. Es scheint, dass dies alles fest codiert sein muss. Ich hatte eine persistence.xml, mit der ich die Datenbankverbindung einfach konfigurieren konnte. Sogar das Einrichten eines Treibers für die DB war einfach. Außerdem gibt es im JDBC keine get / set-Methoden für den Zugriff auf Tabellenentitäten.

Wie verstehe ich JPA und Persistenz in Bezug auf JDBC? Wofür wurde JPA gedacht? Warum gibt es Set / Get-Methoden? Kann jemand etwas Licht auf die Essenz dieser beiden werfen und was sind die Vor- und Nachteile ohne "Jargons"? Bitte schlagen Sie auch einige Links vor. Eine einfache Google-Suche nach JPA- und JDBC-Unterschieden führte mich zu einigen Websites voller "Terminologie", denen ich nicht folgen konnte :(

user907810
quelle
2
Beginnen Sie mit dem JDBC-Tutorial: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name
2
JPA kann ohne EJB oder sogar Java EE verwendet werden. Sie können eine EntityManagerFactory direkt aus Persistence erstellen.
James

Antworten:

237

In Laienbegriffen:

  • JDBC ist ein Standard für den Datenbankzugriff
  • JPA ist ein Standard für ORM

JDBC ist ein Standard für die direkt an einen DB verbinden und mit SQL dagegen - zB SELECT * FROM USERSusw. Datensätze zurückgegeben werden können , die Sie in Ihrer Anwendung verarbeiten kann, und Sie können alle die üblichen Dinge wie zu tun INSERT, DELETEführen Sie gespeicherte Prozeduren, usw. Es ist eine der zugrunde liegenden Technologien für den meisten Java-Datenbankzugriff (einschließlich JPA-Anbietern).

Eines der Probleme bei herkömmlichen JDBC-Apps besteht darin, dass Sie häufig einen beschissenen Code haben, bei dem viele Zuordnungen zwischen Datensätzen und Objekten auftreten, Logik mit SQL gemischt wird usw.

JPA ist ein Standard für die objektrelationale Zuordnung. Dies ist eine Technologie, mit der Sie Objekte in Code- und Datenbanktabellen zuordnen können. Dadurch kann SQL vor dem Entwickler "ausgeblendet" werden, sodass nur Java-Klassen behandelt werden. Der Anbieter ermöglicht es Ihnen, sie zu speichern und magisch zu laden. Meistens können XML-Zuordnungsdateien oder Anmerkungen zu Gettern und Setzern verwendet werden, um dem JPA-Anbieter mitzuteilen, welche Felder in Ihrem Objekt welchen Feldern in der Datenbank zugeordnet sind. Der bekannteste JPA-Anbieter ist Hibernate , daher ist dies ein guter Ausgangspunkt für konkrete Beispiele.

Andere Beispiele sind OpenJPA, Toplink usw.

Unter der Haube schreiben Hibernate und die meisten anderen Anbieter für JPA SQL und verwenden JDBC zum Lesen und Schreiben von und in die Datenbank.

Mark D.
quelle
3
iBatis (heutzutage MyBatis) ist keine JPA-Implementierung. Wenn Sie es sich ansehen, werden Sie feststellen, dass es ein ganz anderes Konzept hat.
Mikko Maunu
Vielen Dank! Mein Fehler, ich dachte es implementiert JPA, jetzt korrigiert!
Mark D
3
Nicht alle JPA-Anbieter schreiben SQL und verwenden JDBC ... da sie möglicherweise auf einem "anderen Datenspeichertyp" (MongoDB, Neo4j usw.) bestehen bleiben. DataNucleus JPA ist ein solches Beispiel
DataNucleus
true DataNucleus .. es gibt sogar solche für Excel usw. - die ursprünglichen Fragen waren JDBC / JPA, also habe ich zu Recht oder zu Unrecht angenommen, dass er an relationalen Geschäften interessiert ist.
Mark D
52

Der Hauptunterschied zwischen JPA und JDBC besteht in der Abstraktionsebene.

JDBC ist ein niedriger Standard für die Interaktion mit Datenbanken. JPA ist ein höherer Standard für den gleichen Zweck. Mit JPA können Sie ein Objektmodell in Ihrer Anwendung verwenden, das Ihnen das Leben erheblich erleichtert. Mit JDBC können Sie mehr Dinge direkt mit der Datenbank tun, dies erfordert jedoch mehr Aufmerksamkeit. Einige Aufgaben können mit JPA nicht effizient gelöst werden, mit JDBC jedoch möglicherweise effizienter.

gkuzmin
quelle
20

JDBC ist eine viel niedrigere (und ältere) Spezifikation als JPA. JDBC ist eine API für die Interaktion mit einer Datenbank unter Verwendung von reinem SQL - Senden von Abfragen und Abrufen von Ergebnissen. Es gibt keine Vorstellung von Objekten oder Hierarchien. Bei Verwendung von JDBC liegt es an Ihnen, eine Ergebnismenge (im Wesentlichen eine Zeilen- / Spaltenmatrix von Werten aus einer oder mehreren Datenbanktabellen, die von Ihrer SQL-Abfrage zurückgegeben werden) in Java-Objekte zu übersetzen.

Um JDBC zu verstehen und zu verwenden, ist es wichtig, dass Sie über Kenntnisse und Kenntnisse in SQL verfügen. Dazu gehört auch ein erforderlicher Einblick in die Bedeutung einer relationalen Datenbank, ihre Arbeitsweise und Konzepte wie Tabellen, Spalten, Schlüssel und Beziehungen. Wenn Sie nicht mindestens ein grundlegendes Verständnis für Datenbanken, SQL und Datenmodellierung haben, können Sie JDBC nicht in großem Umfang nutzen, da es sich tatsächlich nur um eine dünne Abstraktion handelt.

Brei
quelle
10

JDBC ist der Vorgänger von JPA.

JDBC ist eine Brücke zwischen der Java-Welt und der Datenbankwelt. In JDBC müssen Sie alle für CRUD-Vorgänge erforderlichen fehlerhaften Details wie Tabellennamen und Spaltennamen verfügbar machen, während Sie in JPA (das JDBC darunter verwendet) auch diese Details von Datenbankmetadaten angeben, jedoch unter Verwendung von Java-Anmerkungen.

Daher erstellt JPA Aktualisierungsabfragen für Sie und verwaltet die Entitäten, die Sie gesucht oder erstellt / aktualisiert haben (es kann auch mehr).

Wenn Sie JPA ohne Java EE-Container ausführen möchten, können Spring und seine Bibliotheken mit denselben Java-Anmerkungen verwendet werden.

Pawel Solarski
quelle
"ohne Java EE Container ??" Meinen Sie damit, dass Spring und seine Bibliotheken unabhängig von Webcontainern sind?
Bruce Zu
@ BruceZu Natürlich ist es. Sie können viele der Spring Framework-Komponenten verwenden, ohne einen Webcontainer zu benötigen. Die Abhängigkeitsinjektion ist beispielsweise nicht nur in einem Webkontext erforderlich.
Dolfiz
1
@Dolfiz sind die Spring Web Libraries nicht ein Wrapper über die Java Web- und Java EE-Bibliotheken?
Raikumardipak