Hier finden Sie eine Einführung in jede der genannten Technologien.
Spring-DAO
Spring-DAO ist kein Federmodul im engeren Sinne, sondern Konventionen, die Sie dazu verpflichten sollten, DAO zu schreiben und sie gut zu schreiben. Daher bietet es weder Schnittstellen noch Implementierungen oder Vorlagen für den Zugriff auf Ihre Daten. Wenn Sie ein DAO schreiben, sollten Sie diese mit Anmerkungen versehen, @Repository
damit Ausnahmen, die mit der zugrunde liegenden Technologie (JDBC, Hibernate, JPA usw.) verknüpft sind, konsistent in die richtige DataAccessException
Unterklasse übersetzt werden.
Angenommen, Sie verwenden jetzt den Ruhezustand und Ihre Service-Schicht wird abgefangen, HibernateException
um darauf zu reagieren. Wenn Sie zu JPA wechseln, sollten sich Ihre DAOs-Schnittstellen nicht ändern, und die Service-Schicht wird weiterhin mit HibernateException
abfangenden Blöcken kompiliert. Sie werden diese Blöcke jedoch niemals eingeben, da Ihre DAOs jetzt JPA auslösen PersistenceException
. Bei Verwendung @Repository
in Ihrem DAO werden die mit der zugrunde liegenden Technologie verknüpften Ausnahmen in Spring übersetzt DataAccessException
. Ihre Service-Schicht fängt diese Ausnahmen ab. Wenn Sie sich entscheiden, die Persistenz-Technologie zu ändern, DataAccessExceptions
wird immer noch derselbe Frühling ausgelöst, da der Frühling native Ausnahmen übersetzt hat.
Beachten Sie jedoch, dass dies aus folgenden Gründen nur eingeschränkt verwendet werden kann:
- Sie sollten normalerweise keine Persistenzausnahmen abfangen, da der Anbieter die Transaktion möglicherweise zurückgesetzt hat (abhängig vom genauen Ausnahmesubtyp), und Sie sollten die Ausführung daher nicht mit einem alternativen Pfad fortsetzen.
- Die Hierarchie der Ausnahmen ist in Ihrem Provider normalerweise umfangreicher als in Spring, und es gibt keine endgültige Zuordnung von einem Provider zum anderen. Sich darauf zu verlassen ist gefährlich. Dies ist jedoch eine gute Idee, um Ihre DAOs mit Anmerkungen zu versehen
@Repository
, da die Beans beim Scanvorgang automatisch hinzugefügt werden. Darüber hinaus kann Spring der Anmerkung weitere nützliche Funktionen hinzufügen.
Spring-JDBC
Spring-JDBC bietet die JdbcTemplate-Klasse, mit der Installationscode entfernt wird und Sie sich auf die SQL-Abfrage und -Parameter konzentrieren können. Sie müssen es nur mit a konfigurieren DataSource
und können dann Code wie folgt schreiben:
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 bietet auch einen JdbcDaoSupport, den Sie erweitern können, um Ihr DAO zu entwickeln. Grundsätzlich werden zwei Eigenschaften definiert: eine DataSource und eine JdbcTemplate, mit denen beide die DAO-Methoden implementieren können. Es bietet auch einen Ausnahmeübersetzer von SQL-Ausnahmen zu Spring DataAccessExceptions.
Wenn Sie planen, einfaches JDBC zu verwenden, ist dies das Modul, das Sie verwenden müssen.
Spring-ORM
Spring-ORM ist ein Dachmodul, das viele Persistenztechnologien abdeckt, nämlich JPA, JDO, Hibernate und iBatis. Für jede dieser Technologien bietet Spring Integrationsklassen an, sodass jede Technologie gemäß den Spring-Konfigurationsprinzipien verwendet werden kann und sich nahtlos in das Spring-Transaktionsmanagement integrieren lässt.
Für jede Technologie besteht die Konfiguration im Wesentlichen darin, eine DataSource
Bohne in eine Art von SessionFactory
oder zu injizierenEntityManagerFactory
usw. Bohne. Für reines JDBC sind solche Integrationsklassen (außer JdbcTemplate) nicht erforderlich, da JDBC nur auf einer DataSource basiert.
Wenn Sie ein ORM wie JPA oder Hibernate verwenden möchten, benötigen Sie nicht spring-jdbc, sondern nur dieses Modul.
Federdaten
Spring-Data ist ein Dachprojekt, das eine gemeinsame API bereitstellt, um zu definieren, wie allgemeiner auf Daten (DAO + -Anmerkungen) zugegriffen werden soll, wobei sowohl SQL- als auch NOSQL-Datenquellen abgedeckt werden.
Die ursprüngliche Idee besteht darin, eine Technologie bereitzustellen, mit der der Entwickler die Schnittstelle für ein DAO (Finder-Methoden) und die Entitätsklassen technologieunabhängig und nur basierend auf der Konfiguration (Anmerkungen zu DAOs & Entitäten + Federkonfiguration) schreibt xml- oder java-basiert), entscheidet über die Implementierungstechnologie, sei es JPA (SQL) oder Redis, Hadoop usw. (NOSQL).
Wenn Sie die durch spring definierten Namenskonventionen für die Finder-Methodennamen befolgen, müssen Sie in den einfachsten Fällen nicht einmal die Abfragezeichenfolgen angeben, die den Finder-Methoden entsprechen. In anderen Situationen müssen Sie die Abfragezeichenfolge in Anmerkungen zu den Finder-Methoden angeben.
Wenn der Anwendungskontext geladen wird, stellt spring Proxys für die DAO-Schnittstellen bereit, die den gesamten Boilerplate-Code für die Datenzugriffstechnologie enthalten, und ruft die konfigurierten Abfragen auf.
Spring-Data konzentriert sich auf Nicht-SQL-Technologien, bietet jedoch weiterhin ein Modul für JPA (die einzige SQL-Technologie).
Was kommt als nächstes
Wenn Sie das alles wissen, müssen Sie jetzt entscheiden, was Sie auswählen möchten. Die gute Nachricht hier ist, dass Sie keine endgültige Entscheidung für die Technologie treffen müssen. Hier liegt Spring Power tatsächlich: Als Entwickler konzentrieren Sie sich beim Schreiben von Code auf das Geschäft, und wenn Sie es gut machen, ist das Ändern der zugrunde liegenden Technologie ein Implementierungs- oder Konfigurationsdetail.
- Definieren Sie ein Datenmodell mit POJO-Klassen für die Entitäten und rufen Sie Methoden ab, um die Entitätsattribute und die Beziehungen zu anderen Entitäten darzustellen. Sie müssen sicherlich die Entitätsklassen und -felder basierend auf der Technologie mit Anmerkungen versehen, aber für den Moment reichen POJOs aus, um damit zu beginnen. Konzentrieren Sie sich vorerst nur auf die Geschäftsanforderungen.
- Definieren Sie Schnittstellen für Ihre DAOs. 1 DAO deckt genau 1 Entität ab, aber Sie benötigen sicherlich nicht für jede Entität ein DAO, da Sie in der Lage sein sollten, zusätzliche Entitäten durch Navigieren in den Beziehungen zu laden. Definieren Sie die Finder-Methoden nach strengen Namenskonventionen.
- Auf dieser Grundlage kann eine andere Person mit der Arbeit an der Serviceschicht beginnen, mit Verspottungen für Ihre DAOs.
- Sie lernen die verschiedenen Persistenztechnologien (SQL, No-SQL) kennen, um die beste Lösung für Ihre Anforderungen zu finden, und wählen eine davon aus. Auf dieser Grundlage kommentieren Sie die Entitäten und implementieren die DAOs (oder lassen sie von Spring für Sie implementieren, wenn Sie Spring-Daten verwenden).
- Wenn sich die Geschäftsanforderungen ändern und Ihre Datenzugriffstechnologie nicht ausreicht, um sie zu unterstützen (z. B. Sie haben mit JDBC und einigen Entitäten begonnen, benötigen jetzt jedoch ein umfassenderes Datenmodell und JPA ist die bessere Wahl), müssen Sie die Implementierung ändern Fügen Sie von Ihren DAOs einige Anmerkungen zu Ihren Entitäten hinzu und ändern Sie die Federkonfiguration (fügen Sie eine EntityManagerFactory-Definition hinzu). Der Rest Ihres Geschäftscodes sollte keine anderen Auswirkungen Ihrer Änderung sehen.
Hinweis: Transaktionsmanagement
Spring bietet eine API für das Transaktionsmanagement. Wenn Sie Spring für den Datenzugriff verwenden möchten, sollten Sie Spring auch für das Transaktionsmanagement verwenden, da diese sehr gut zusammenpassen. Für jede von spring unterstützte Datenzugriffstechnologie gibt es einen passenden Transaktionsmanager für lokale Transaktionen, oder Sie können JTA auswählen, wenn Sie verteilte Transaktionen benötigen. Alle implementieren dieselbe API, sodass die Wahl der Technologie (erneut) nur eine Frage der Konfiguration ist, die ohne weitere Auswirkungen auf den Geschäftscode geändert werden kann.
Hinweis: Federdokumentation
Die von Ihnen erwähnten Links zur Spring-Dokumentation sind ziemlich alt. Hier ist die Dokumentation der neuesten Version (4.1.6, die alle Themen abdeckt):
Spring-Daten sind nicht Teil des Spring-Frameworks. Es gibt ein allgemeines Modul, das Sie zuerst lesen sollten, um sich an die Prinzipien zu gewöhnen. Dokumentation finden Sie hier: