Je passais en revue les technologies d’accès aux données supportées par Spring, et j’ai remarqué qu’il mentionnait plusieurs options et je ne suis pas sûr de la différence entre elles:
Si je comprends bien, Spring JDBC fournit des modèles permettant de réduire le code standard afin d’accéder à une base de données de manière très simple: vous écrivez vos propres requêtes SQL.
Spring-ORM fournit des modèles simplifiés pour accéder aux bases de données via des technologies ORM, telles que Hibernate, My (i) Batis, etc.
Spring-DAO selon le site Web de Spring:
La prise en charge de DAO (Data Access Object) au printemps a pour but de le rendre facile à utiliser avec les technologies d'accès aux données telles que JDBC, Hibernate ou JDO de manière cohérente
Je suis un peu clair sur ORM vs JDBC, car ils visent différentes manières d'accéder à la base de données. Mais Spring-DAO est tout simplement déroutant!
Quelqu'un pourrait-il clarifier quelles sont exactement les différences entre ces trois? Quelles sont les situations à privilégier?
De plus, il existe un autre projet Spring-DATA
également disponible ( http://projects.spring.io/spring-data/ ) Maintenant, s’agit-il d’un projet parent pour tous les techniciens d’accès aux données pris en charge par Spring ou est-ce juste? un nouveau nom pour Spring-DAO?
Voici une introduction à chaque technologie mentionnée.
Spring-DAO
Spring-DAO n’est pas stricto senso un module printanier, mais plutôt des conventions qui devraient vous obliger à écrire DAO et à bien les écrire. En tant que tel, il ne fournit ni interfaces, ni implémentations, ni modèles pour accéder à vos données. Lorsque vous écrivez un DAO, annotez-le avec @Repository
afin que les exceptions liées à la technologie sous-jacente (JDBC, Hibernate, JPA, etc.) soient systématiquement traduites dans la sous-classe DataAccessException
appropriée.
Par exemple, supposons que vous utilisiez maintenant Hibernate et que votre couche de service contienne HibernateException
afin de pouvoir y réagir. Si vous passez à JPA, vos interfaces DAO ne doivent pas changer et la couche de service sera toujours compilée avec des blocs capturés HibernateException
, mais vous ne les entrerez jamais car vos DAO lançent maintenant JPA PersistenceException
. En utilisant @Repository
sur votre DAO, les exceptions liées à la technologie sous-jacente sont traduites en Spring DataAccessException
; votre couche de service intercepte ces exceptions et si vous décidez de changer de technologie de persistance, la même variable Printemps DataAccessExceptions
sera toujours émise, car spring aura traduit les exceptions natives.
Notez toutefois que son utilisation est limitée pour les raisons suivantes:
@Repository
, car les beans seront automatiquement ajoutés par la procédure d'analyse. De plus, Spring peut ajouter d’autres fonctionnalités utiles à l’annotation.Spring-JDBC
Spring-JDBC fournit la classe JdbcTemplate, qui supprime le code de plomberie et vous aide à vous concentrer sur la requête SQL et ses paramètres. Vous avez juste besoin de le configurer avec une DataSource
, et vous pouvez ensuite écrire du code comme celui-ci:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC fournit également un support JdbcDaoSupport, que vous pouvez étendre pour développer votre DAO. Il définit en gros 2 propriétés: un DataSource et un JdbcTemplate qui peuvent être utilisés pour implémenter les méthodes DAO. Il fournit également un traducteur d'exceptions à partir des exceptions SQL pour print DataAccessExceptions.
Si vous envisagez d’utiliser plain jdbc, c’est le module que vous devrez utiliser.
Spring-ORM
Spring-ORM est un module parapluie couvrant de nombreuses technologies de persistance, notamment JPA, JDO, Hibernate et iBatis. Spring fournit des classes d'intégration pour chacune de ces technologies, de sorte que chaque technologie puisse être utilisée conformément aux principes de configuration de Spring et s'intègre de manière fluide à la gestion des transactions de Spring.
Pour chaque technologie, la configuration consiste essentiellement à injecter un bean DataSource
dans une sorte de bean SessionFactory
ou EntityManagerFactory
etc. Pour JDBC pur, de telles classes d'intégration ne sont pas nécessaires (à part JdbcTemplate), car JDBC ne s'appuie que sur un DataSource.
Si vous envisagez d'utiliser un ORM comme JPA ou Hibernate, vous n'aurez pas besoin de spring-jdbc, mais uniquement de ce module.
Spring-Data
Spring-Data est un projet cadre qui fournit une API commune pour définir le mode d'accès aux données (annotations DAO +) de manière plus générique, couvrant à la fois les sources de données SQL et NOSQL.
L’idée de départ est de fournir une technologie permettant au développeur d’écrire l’interface pour une DAO (méthodes Finder) et les classes d’entités d’une manière indépendante de la technologie et, en fonction de la configuration uniquement (annotations sur les DAO et les entités + configuration de ressort, que ce soit). xml ou Java), décide de la technologie d'implémentation, qu'il s'agisse de JPA (SQL), de Redis, d'Hadoop, etc. (NOSQL).
Si vous suivez les conventions de dénomination définies par spring pour les noms de méthodes du Finder, vous n'avez même pas besoin de fournir les chaînes de requête correspondant aux méthodes du Finder pour les cas les plus simples. Dans d'autres situations, vous devez fournir la chaîne de requête à l'intérieur des annotations sur les méthodes du Finder.
Lorsque le contexte de l'application est chargé, spring fournit des proxy pour les interfaces DAO, contenant tout le code standard associé à la technologie d'accès aux données, et appelle les requêtes configurées.
Spring-Data se concentre sur les technologies non-SQL, mais fournit toujours un module pour JPA (la seule technologie SQL).
Et après
Sachant tout cela, vous devez maintenant décider quoi choisir. La bonne nouvelle est qu'il n'est pas nécessaire de faire un choix définitif pour la technologie. C'est en fait là que réside Spring power: en tant que développeur, vous vous concentrez sur votre activité lorsque vous écrivez du code. Si vous le faites bien, le changement de technologie sous-jacente est un détail d'implémentation ou de configuration.Définissez un modèle de données avec des classes POJO pour les entités et des méthodes get/set pour représenter les attributs d'entité et les relations avec d'autres entités. Vous aurez certainement besoin d’annoter les classes d’entité et les champs en fonction de la technologie, mais pour l’instant, les POJO sont suffisants pour commencer. Concentrez-vous simplement sur les besoins de votre entreprise.
Remarque: documentation Spring
Les liens vers la documentation de Spring que vous avez mentionnés sont plutôt anciens. Voici la documentation de la dernière version (4.1.6, couvrant tous les sujets):.
Page html unique: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/
Une seule page html: http://docs.spring.io/spring-data/data-commons/docs/1.9.2.RELEASE/reference/html/
Vous créez une interface telle que SomeObjectDao
, puis vous créez différentes implémentations de cette interface, telles que JdbcSomeObjectDao
, HibernateSomeObjectDao
. Ensuite, dans votre classe SomeObjectService
, vous utiliserez l'interface SomeObjectDao
et y injecterez l'une des implémentations concrètes. Ainsi, chaque implémentation de SomeObjectDao
masquera les détails, que vous utilisiez JDBC, ORM, etc.
En général, JDBC et différentes implémentations de ORM génèrent différents types d'exceptions. Le support DAO de Spring peut mapper ces différentes exceptions, propres à une technologie, aux exceptions communes de DAO de Spring. Vous êtes donc davantage découplé de la mise en œuvre réelle. De plus, le support DAO de Spring offre un ensemble de classes abstraites *DataSupport
qui aident encore plus au développement DAO. Donc, en plus de l'implémentation de votre interface SomeObjectDao
, vous pouvez étendre l'une des classes *DataSupport
de Spring.
Comme information supplémentaire. Je vous suggère d'utiliser Spring Data JPA. Utiliser des annotations telles que: @Repository, @Service. Je vous montre un exemple:
@Repository("customerEntitlementsRepository")
public interface CustomerEntitlementsRepository extends CrudRepository<BbsExerul, BbsExerulPK> {
@Query(value = "SELECT " + "CONTRACT_NUMBER, EXECUTIVE_NUMBER, " + "GROUP_VALUE, " + "CODE, "
+ "SUBCODE, " + "CURRENCY " + "FROM BBS_EXERUL " + "WHERE CONTRACT_NUMBER =:clientId AND "
+ "EXECUTIVE_NUMBER =:representativeId", nativeQuery = true)
Collection<CustomerEntitlementsProjection> getFieldsExerul(@Param("clientId") String clientId,
@Param("representativeId") String representativeId);
}
Où CustomerEntitlementsProjection est une projection de printemps, liée à votre entité ou à un objet DTO;
@Projection(name = "customerEntitlementsProjection", types = { BbsExerul.class })
public interface CustomerEntitlementsProjection {
String getContractNumber();
String getExecutiveNumber();