JPA czy JDBC, czym się różnią?

119

Uczę się Java EE i pobrałem zaćmienie szklistą rybką dla tego samego. Widziałem kilka przykładów, a także przeczytałem dokumentację Oracle, aby dowiedzieć się wszystkiego o Java EE 5. Połączenie z bazą danych było bardzo proste. Otworzyłem dynamiczny projekt sieciowy, utworzyłem sesyjny EJB, użyłem EntityManager i za pomocą metod get uzyskałem dostęp do przechowywanej tabeli danych.

Dla mojego następnego projektu utworzyłem prostą klasę, a następnie uzyskałem dostęp do jakiejś tabeli DB. Pierwszym problemem, jaki napotkałem, było to, że atrybut PersistenceUnit byłby rozpoznawany tylko przez EJB, Servlet itp., A nie przez prostą klasę Java. Więc nie mogłem użyć metody EntityManager (czy mogę?)

Poproszono mnie, abym poszedł drogą "JDBC". Pierwszym problemem, jaki napotkałem, było uzyskanie połączenia z bazą danych. Wygląda na to, że wszystko to musi być zakodowane. Miałem plik persistence.xml, za pomocą którego mogłem łatwo skonfigurować połączenie z bazą danych. Nawet skonfigurowanie sterownika dla DB było łatwe. W JDBC nie ma również żadnych metod pobierania / ustawiania dostępu do jednostek tabeli.

Jak rozumiem JPA i wytrwałość w odniesieniu do JDBC? O czym myślano WZP? Dlaczego istnieją metody set / get? Czy ktoś może rzucić nieco światła na istotę tych dwóch i jakie są plusy / minusy bez „żargonów”? Proszę również zasugerować kilka linków. Proste wyszukiwanie w Google różnic między JPA i JDBC doprowadziło mnie do witryn pełnych „terminologii”, których nie mogłem śledzić :(

user907810
źródło
2
Dlaczego nie zacząć od samouczka JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name
2
JPA może być używany bez EJB lub nawet Java EE, możesz utworzyć EntityManagerFactory bezpośrednio z Persistence.
James

Odpowiedzi:

237

W kategoriach laika:

  • JDBC to standard dostępu do bazy danych
  • JPA to standard dla ORM

JDBC jest standardem podłączania do DB SQL bezpośrednio i działa przeciwko nim - np SELECT * FROM USERSitd zestawy danych mogą zostać zwrócone który można obsługiwać w aplikacji, można zrobić wszystkie standardowe rzeczy jak INSERT, DELETE, które są prowadzone procedury przechowywane, itp Jest to jedna z podstawowych technologii odpowiedzialnych za dostęp do większości baz danych Java (w tym dostawców JPA).

Jednym z problemów z tradycyjnymi aplikacjami JDBC jest to, że często można mieć kiepski kod, w którym występuje dużo mapowania między zestawami danych i obiektami, logika jest mieszana z SQL itp.

JPA to standard mapowania relacyjnego obiektu. Jest to technologia, która umożliwia mapowanie obiektów w kodzie i tabelach bazy danych. Może to „ukryć” SQL przed programistą, tak że wszystko, czym zajmują się to klasy Java, a dostawca umożliwia ich zapisywanie i ładowanie w magiczny sposób. Przeważnie pliki mapowania XML lub adnotacje na metodach pobierających i ustawiających mogą być używane do informowania dostawcy JPA, które pola w twoim obiekcie są mapowane na które pola w bazie danych. Najbardziej znanym dostawcą JPA jest Hibernate , więc jest to dobre miejsce, aby zacząć od konkretnych przykładów.

Inne przykłady obejmują OpenJPA, górne łącze itp.

Pod maską Hibernate i większość innych dostawców JPA piszą SQL i używają JDBC do odczytu i zapisu z i do bazy danych.

Mark D.
źródło
3
iBatis (obecnie MyBatis) nie jest implementacją JPA. Jeśli spojrzysz na to, zauważysz, że ma zupełnie inną koncepcję.
Mikko Maunu
dzięki! Mój błąd, myślałem, że wdrożył JPA, poprawiony teraz!
Mark D,
3
Nie wszyscy dostawcy JPA piszą SQL i używają JDBC ... ponieważ mogą pozostać w „innym typie magazynu danych” (MongoDB, Neo4j itp.). DataNucleus JPA jest jednym z takich przykładów
DataNucleus
true DataNucleus .. są nawet takie do excela, itp. - oryginalne pytania to JDBC / JPA, więc słusznie lub niesłusznie założyłem, że interesują go sklepy relacyjne.
Mark D
52

Główną różnicą między JPA a JDBC jest poziom abstrakcji.

JDBC to niskopoziomowy standard interakcji z bazami danych. JPA jest standardem wyższego poziomu w tym samym celu. JPA pozwala na użycie modelu obiektowego w aplikacji, co może znacznie ułatwić Ci życie. JDBC pozwala zrobić więcej rzeczy bezpośrednio z bazą danych, ale wymaga więcej uwagi. Niektórych zadań nie można skutecznie rozwiązać za pomocą JPA, ale można je rozwiązać wydajniej za pomocą JDBC.

gkuzmin
źródło
20

JDBC to specyfikacja znacznie niższego poziomu (i starsza) niż JPA. W istocie JDBC jest interfejsem API do interakcji z bazą danych przy użyciu czystego SQL - wysyłania zapytań i pobierania wyników. Nie ma pojęcia o obiektach ani hierarchiach. Podczas korzystania z JDBC to do Ciebie należy przetłumaczenie zestawu wyników (zasadniczo macierzy wiersz / kolumna wartości z jednej lub więcej tabel bazy danych, zwróconych przez zapytanie SQL) na obiekty Java.

Teraz, aby zrozumieć i używać JDBC, konieczne jest zrozumienie i praktyczna znajomość języka SQL. Dzięki temu uzyskuje się również wymagany wgląd w to, czym jest relacyjna baza danych, jak z nią pracuje, oraz pojęcia takie jak tabele, kolumny, klucze i relacje. Jeśli nie masz przynajmniej podstawowej wiedzy na temat baz danych, SQL i modelowania danych, nie będziesz w stanie wykorzystać JDBC, ponieważ jest to tak naprawdę tylko cienka abstrakcja na wierzchu tych rzeczy.

papka
źródło
10

JDBC jest poprzednikiem JPA.

JDBC jest pomostem między światem Java a światem baz danych. W JDBC musisz ujawnić wszystkie brudne szczegóły potrzebne do operacji CRUD, takie jak nazwy tabel, nazwy kolumn, podczas gdy w JPA (który używa JDBC pod spodem), również te szczegóły metadanych bazy danych, ale z użyciem adnotacji Java.

Zatem JPA tworzy dla Ciebie zapytania aktualizacyjne i zarządza encjami, które wyszukałeś lub utworzyłeś / zaktualizowałeś (robi też więcej).

Jeśli chcesz zrobić JPA bez kontenera Java EE, Spring i jego biblioteki mogą być używane z tymi samymi adnotacjami Java.

Paweł Solarski
źródło
„bez kontenera Java EE?” Masz na myśli, że Spring i jego biblioteki są niezależne od kontenera internetowego?
Bruce Zu
@BruceZu Oczywiście, że tak. Możesz używać wielu komponentów platformy Spring bez konieczności posiadania kontenera WWW. Na przykład wstrzykiwanie zależności nie jest potrzebne tylko w kontekście sieciowym.
Dolfiz
1
@Dolfiz czy wiosenne biblioteki internetowe nie są opakowaniem dla bibliotek Java Web i Java EE?
raikumardipak