JPA o JDBC, in cosa differiscono?


119

Sto imparando Java EE e ho scaricato l'eclissi con glassfish per lo stesso. Ho visto alcuni esempi e ho letto anche i documenti Oracle per sapere tutto su Java EE 5. La connessione a un database è stata molto semplice. Ho aperto un progetto web dinamico, creato un EJB di sessione, ho utilizzato EntityManager e con i metodi get ho potuto accedere alla tabella dei dati memorizzati.

Per il mio prossimo progetto ho dovuto creare una semplice classe e quindi accedere a una tabella DB. Il primo vero problema che ho riscontrato è stato che l'attributo PersistenceUnit sarebbe stato riconosciuto solo da EJB, Servlet, ecc. E non da una semplice classe Java. Quindi non ho potuto usare il modo EntityManager (o posso?)

Mi è stato chiesto di passare attraverso il modo "JDBC". Il primo vero problema che ho riscontrato è stato ottenere la connessione al DB. Sembra che tutto questo debba essere codificato. Avevo un persistence.xml con il quale potevo facilmente configurare la connessione al database. Anche impostare un driver per il DB è stato facile. Inoltre non esistono metodi get / set nel JDBC per accedere alle entità di tabella.

Come capisco JPA e persistenza in relazione a JDBC? A cosa è stato pensato l'APP? Perché esistono metodi set / get? Qualcuno può gettare un po 'di luce sull'essenza di questi due e quali sono i pro / contro senza "gerghi" ?? Si prega di suggerire anche alcuni link. Una semplice ricerca su Google per le differenze JPA e JDBC mi ha portato ad alcuni siti pieni di "terminologia" che non potevo seguire :(


2
Perché non iniziare con il tutorial JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPA può essere utilizzato senza EJB o anche Java EE, è possibile creare un EntityManagerFactory direttamente da Persistence.
James il

Risposte:


237

In parole povere:

  • JDBC è uno standard per l'accesso al database
  • JPA è uno standard per ORM

JDBC è uno standard per connettersi direttamente a un DB ed eseguire SQL su di esso, ad esempio SELECT * FROM USERSecc. Possono essere restituiti set di dati che puoi gestire nella tua app e puoi fare tutte le solite cose come INSERT,DELETE , stored procedure eseguite, etc. È una delle tecnologie alla base della maggior parte degli accessi ai database Java (inclusi i provider JPA).

Uno dei problemi con le app JDBC tradizionali è che spesso è possibile avere codice scadente in cui si verificano molte mappature tra set di dati e oggetti, la logica è mescolata con SQL, ecc.

JPA è uno standard per Object Relational Mapping. Questa è una tecnologia che consente di mappare tra oggetti nel codice e tabelle di database. Questo può "nascondere" l'SQL allo sviluppatore in modo che tutto ciò con cui hanno a che fare sono classi Java, e il provider ti permette di salvarle e caricarle magicamente. Per lo più, i file di mappatura XML o le annotazioni su getter e setter possono essere utilizzati per indicare al provider JPA quali campi del tuo oggetto mappare a quali campi nel DB. Il provider JPA più famoso è Hibernate , quindi è un buon punto di partenza per esempi concreti.

Altri esempi includono OpenJPA, toplink, ecc.

Dietro le quinte, Hibernate e la maggior parte degli altri fornitori di JPA scrivono SQL e utilizzano JDBC per leggere e scrivere da e sul DB.


3
iBatis (al giorno d'oggi MyBatis) non è un'implementazione JPA. Se gli dai un'occhiata, noterai che ha un concetto molto diverso.
Mikko Maunu

Grazie! Errore mio, pensavo che implementasse JPA, ora corretto!
Mark D

3
Non tutti i provider JPA scrivono SQL e utilizzano JDBC ... poiché possono persistere in un "diverso tipo di datastore" (MongoDB, Neo4j, ecc.). DataNucleus JPA è uno di questi esempi
DataNucleus

true DataNucleus .. ce ne sono anche di excel, ecc. - la domanda originale era JDBC / JPA, quindi ho giustamente o erroneamente pensato che fosse interessato agli archivi relazionali.
Mark D

52

La principale differenza tra JPA e JDBC è il livello di astrazione.

JDBC è uno standard di basso livello per l'interazione con i database. JPA è uno standard di livello superiore per lo stesso scopo. JPA ti consente di utilizzare un modello a oggetti nella tua applicazione che può semplificarti la vita. JDBC ti consente di fare più cose direttamente con il database, ma richiede maggiore attenzione. Alcune attività non possono essere risolte in modo efficiente utilizzando JPA, ma possono essere risolte in modo più efficiente con JDBC.


20

JDBC è una specifica di livello molto inferiore (e precedente) rispetto a JPA. Di base, JDBC è un'API per interagire con un database utilizzando SQL puro, inviando query e recuperando risultati. Non ha nozione di oggetti o gerarchie. Quando si utilizza JDBC, sta a voi tradurre un set di risultati (essenzialmente una matrice di valori di riga / colonna da una o più tabelle di database, restituite dalla vostra query SQL) in oggetti Java.

Ora, per comprendere e utilizzare JDBC è essenziale che tu abbia una certa comprensione e conoscenza operativa di SQL. Con ciò arriva anche una visione necessaria di cosa sia un database relazionale, come lavorate con esso e concetti come tabelle, colonne, chiavi e relazioni. A meno che tu non abbia almeno una conoscenza di base dei database, dell'SQL e della modellazione dei dati, non sarai in grado di fare molto uso di JDBC poiché è in realtà solo una sottile astrazione in cima a queste cose.


10

JDBC è il predecessore di JPA.

JDBC è un ponte tra il mondo Java e il mondo dei database. In JDBC è necessario esporre tutti i dettagli sporchi necessari per le operazioni CRUD, come nomi di tabelle, nomi di colonne, mentre in JPA (che utilizza JDBC sotto), si specificano anche quei dettagli dei metadati del database, ma con l'uso di annotazioni Java.

Quindi JPA crea query di aggiornamento per te e gestisce le entità che hai cercato o creato / aggiornato (fa anche di più).

Se si desidera eseguire JPA senza un contenitore Java EE, è possibile utilizzare Spring e le sue librerie con le stesse annotazioni Java.


"senza un contenitore Java EE ??" Vuoi dire che Spring e le sue librerie sono indipendenti dal web container?
Bruce Zu

@BruceZu Certo che lo è. È possibile utilizzare molti dei componenti del framework Spring senza bisogno di un contenitore Web. L'iniezione di dipendenza, ad esempio, non è qualcosa di cui hai bisogno solo in un contesto web.
Dolfiz

1
@Dolfiz le librerie web primaverili non sono un wrapper delle librerie Java Web e Java EE?
raikumardipak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.