JPA ou JDBC, en quoi sont-ils différents?


119

J'apprends Java EE et j'ai téléchargé l'éclipse avec glassfish pour le même. J'ai vu quelques exemples et aussi lu la documentation Oracle pour tout savoir sur Java EE 5. La connexion à une base de données était très simple. J'ai ouvert un projet Web dynamique, créé une session EJB, j'ai utilisé EntityManager et avec les méthodes get j'ai pu accéder à la table de données stockée.

Pour mon prochain projet, j'avais créé une classe simple et ensuite accéder à une table DB. Le tout premier problème que j'ai rencontré était que l'attribut PersistenceUnit ne serait reconnu que par EJB, Servlet, etc. et non par une simple classe Java. Alors je ne pourrais pas utiliser la manière EntityManager (ou puis-je?)

On m'a demandé de passer par la voie "JDBC". Le tout premier problème que j'ai rencontré était d'obtenir la connexion à la base de données. Il semble que tout cela doit être codé en dur. J'avais un persistence.xml avec lequel je pouvais facilement configurer la connexion à la base de données. Même la configuration d'un pilote pour la base de données était facile. Il n'y a pas non plus de méthodes get / set dans le JDBC pour accéder aux entités de table.

Comment comprendre JPA et la persistance par rapport à JDBC? À quoi a été pensé JPA? Pourquoi y a-t-il des méthodes set / get? Quelqu'un peut-il jeter un peu de lumière sur l'essence de ces deux et quels sont les avantages / inconvénients sans "jargons" ?? Veuillez également suggérer des liens. Une simple recherche sur Google des différences JPA et JDBC m'a conduit à des sites pleins de "terminologie" que je ne pouvais pas suivre :(


2
Pourquoi ne pas commencer par le didacticiel JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPA peut être utilisé sans EJB ou même Java EE, vous pouvez créer une EntityManagerFactory directement à partir de Persistence.
James

Réponses:


238

En termes simples:

  • JDBC est un standard pour l'accès aux bases de données
  • JPA est un standard pour ORM

JDBC est un standard pour la connexion à un DB directement et exécutant SQL contre - par exemple SELECT * FROM USERS, etc. Les jeux de données peuvent être retournés que vous pouvez gérer dans votre application, et vous pouvez faire toutes les choses habituelles comme INSERT, DELETE, exécuter des procédures stockées, etc. C'est l'une des technologies sous-jacentes à la plupart des accès aux bases de données Java (y compris les fournisseurs JPA).

L'un des problèmes avec les applications JDBC traditionnelles est que vous pouvez souvent avoir du code de merde où beaucoup de mappage entre les ensembles de données et les objets se produisent, la logique est mélangée avec SQL, etc.

JPA est une norme pour le mappage relationnel d'objets. Il s'agit d'une technologie qui vous permet de mapper entre les objets dans les tables de code et de base de données. Cela peut "cacher" le SQL au développeur afin qu'il ne traite que des classes Java, et le fournisseur vous permet de les sauvegarder et de les charger par magie. La plupart du temps, les fichiers de mappage XML ou les annotations sur les getters et les setters peuvent être utilisés pour indiquer au fournisseur JPA quels champs de votre objet mappent vers quels champs de la base de données. Le fournisseur JPA le plus connu est Hibernate , c'est donc un bon point de départ pour des exemples concrets.

D'autres exemples incluent OpenJPA, toplink, etc.

Sous le capot, Hibernate et la plupart des autres fournisseurs de JPA écrivent SQL et utilisent JDBC pour lire et écrire depuis et vers la base de données.


3
iBatis (actuellement MyBatis) n'est pas une implémentation JPA. Si vous y jetez un œil, vous remarquerez qu'il a un concept très différent.
Mikko Maunu

Merci! Mon erreur, je pensais qu'il implémentait JPA, corrigée maintenant!
Mark D

3
Tous les fournisseurs JPA n'écrivent pas SQL et n'utilisent pas JDBC ... car ils peuvent persister dans un "type de magasin de données différent" (MongoDB, Neo4j, etc.). DataNucleus JPA en est un exemple
DataNucleus

vrai DataNucleus .. il y en a même pour Excel, etc. - les questions originales étaient JDBC / JPA, donc j'ai supposé à tort ou à raison qu'il s'intéressait aux magasins relationnels.
Mark D

52

La principale différence entre JPA et JDBC est le niveau d'abstraction.

JDBC est une norme de bas niveau pour l'interaction avec les bases de données. JPA est une norme de niveau supérieur dans le même but. JPA vous permet d'utiliser un modèle objet dans votre application, ce qui peut vous faciliter la vie. JDBC vous permet de faire plus de choses directement avec la base de données, mais cela nécessite plus d'attention. Certaines tâches ne peuvent pas être résolues efficacement avec JPA, mais peuvent être résolues plus efficacement avec JDBC.


20

JDBC est une spécification de niveau beaucoup plus bas (et plus ancienne) que JPA. Dans ses éléments essentiels, JDBC est une API pour interagir avec une base de données à l'aide de SQL pur - envoyer des requêtes et récupérer des résultats. Il n'a aucune notion d'objets ou de hiérarchies. Lorsque vous utilisez JDBC, c'est à vous de traduire un ensemble de résultats (essentiellement une matrice de lignes / colonnes de valeurs d'une ou plusieurs tables de base de données, renvoyées par votre requête SQL) en objets Java.

Maintenant, pour comprendre et utiliser JDBC, il est essentiel que vous ayez une certaine compréhension et une connaissance pratique de SQL. Cela donne également un aperçu nécessaire de ce qu'est une base de données relationnelle, de la façon dont vous travaillez avec elle et de concepts tels que les tables, les colonnes, les clés et les relations. À moins que vous n'ayez au moins une compréhension de base des bases de données, du SQL et de la modélisation de données, vous ne pourrez pas utiliser beaucoup JDBC car ce n'est vraiment qu'une mince abstraction en plus de ces choses.


10

JDBC est le prédécesseur de JPA.

JDBC est un pont entre le monde Java et le monde des bases de données. Dans JDBC, vous devez exposer tous les détails sales nécessaires pour les opérations CRUD, tels que les noms de table, les noms de colonne, tandis que dans JPA (qui utilise JDBC en dessous), vous spécifiez également ces détails des métadonnées de la base de données, mais avec l'utilisation d'annotations Java.

Ainsi, JPA crée des requêtes de mise à jour pour vous et gère les entités que vous avez recherchées ou créées / mises à jour (il fait plus aussi).

Si vous voulez faire JPA sans conteneur Java EE, Spring et ses bibliothèques peuvent être utilisés avec les mêmes annotations Java.


"sans conteneur Java EE ??" Voulez-vous dire que Spring et ses bibliothèques sont indépendants du conteneur Web?
Bruce Zu

@BruceZu Bien sûr que ça l'est. Vous pouvez utiliser de nombreux composants du framework Spring sans avoir besoin d'un conteneur Web. L'injection de dépendances, par exemple, n'est pas quelque chose dont vous avez besoin uniquement dans un contexte Web.
Dolfiz

1
@Dolfiz Les bibliothèques Spring Web ne sont-elles pas un wrapper des bibliothèques Java Web et Java EE?
raikumardipak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.