Oto wprowadzenie do każdej wymienionej technologii.
Wiosna-DAO
Spring-DAO nie jest modułem sprężynowym w ścisłym tego słowa znaczeniu, ale raczej konwencjami, które powinny dyktować ci pisanie DAO i pisanie ich dobrze. W związku z tym nie zapewnia interfejsów, implementacji ani szablonów dostępu do danych. Podczas pisania DAO należy opatrzyć je adnotacjami @Repository
, aby wyjątki związane z podstawową technologią (JDBC, Hibernate, JPA itp.) Były konsekwentnie tłumaczone na odpowiednią DataAccessException
podklasę.
Na przykład załóżmy, że używasz teraz Hibernacji, a Twoja warstwa usług przechwytuje HibernateException
, aby na nią zareagować. Jeśli zmienisz na JPA, twoje interfejsy DAO nie powinny się zmienić, a warstwa usług będzie nadal kompilować się z blokami, które przechwytują HibernateException
, ale nigdy nie wejdziesz do tych bloków, ponieważ DAO rzucają teraz JPA PersistenceException
. Korzystając @Repository
z DAO, wyjątki powiązane z podstawową technologią są tłumaczone na Spring DataAccessException
; Twoja warstwa usług wyłapuje te wyjątki i jeśli zdecydujesz się zmienić technologię trwałości, ten sam Spring DataAccessExceptions
będzie nadal generowany, ponieważ Spring przetłumaczył natywne wyjątki.
Należy jednak pamiętać, że ma to ograniczone zastosowanie z następujących powodów:
- Zwykle nie należy przechwytywać wyjątków trwałości, ponieważ dostawca mógł wycofać transakcję (w zależności od dokładnego podtypu wyjątku), a zatem nie należy kontynuować wykonywania z alternatywną ścieżką.
- Hierarchia wyjątków jest zwykle bogatsza w Twoim dostawcy niż to, co zapewnia Spring, i nie ma ostatecznego mapowania od jednego dostawcy do drugiego. Poleganie na tym jest niebezpieczne. Jest to jednak dobry pomysł, aby oznaczyć swoje DAO adnotacjami
@Repository
, ponieważ ziarna zostaną automatycznie dodane podczas procedury skanowania. Ponadto Spring może dodać inne przydatne funkcje do adnotacji.
Wiosna-JDBC
Spring-JDBC udostępnia klasę JdbcTemplate, która usuwa kod hydrauliczny i pomaga skoncentrować się na zapytaniu SQL i parametrach. Wystarczy skonfigurować go za pomocą a DataSource
, a następnie możesz napisać taki kod:
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 zapewnia również wsparcie Jdbc_actionSupport, które możesz rozszerzyć, aby rozwinąć DAO. Zasadniczo definiuje 2 właściwości: DataSource i JdbcTemplate, które mogą być używane do implementacji metod DAO. Zapewnia również translator wyjątków z wyjątków SQL do sprężynowych wyjątków DataAccessExceptions.
Jeśli planujesz używać zwykłego jdbc, jest to moduł, którego będziesz potrzebować.
Spring-ORM
Spring-ORM to moduł parasolowy obejmujący wiele technologii trwałości, a mianowicie JPA, JDO, Hibernate i iBatis. Dla każdej z tych technologii Spring udostępnia klasy integracji, dzięki czemu każda technologia może być używana zgodnie z zasadami konfiguracji Springa i płynnie integruje się z zarządzaniem transakcjami Spring.
Dla każdej techniki, konfiguracja w zasadzie polega na wstrzykiwaniu DataSource
fasoli w jakimś SessionFactory
lub EntityManagerFactory
itd fasoli. W przypadku czystego JDBC nie ma potrzeby tworzenia takich klas integracji (poza JdbcTemplate), ponieważ JDBC opiera się tylko na DataSource.
Jeśli planujesz użyć ORM, takiego jak JPA lub Hibernate, nie będziesz potrzebować spring-jdbc, ale tylko ten moduł.
Spring-Data
Spring-Data to projekt parasolowy, który zapewnia wspólny interfejs API do definiowania sposobu uzyskiwania dostępu do danych (DAO + adnotacje) w bardziej ogólny sposób, obejmujący zarówno źródła danych SQL, jak i NOSQL.
Początkowym pomysłem jest zapewnienie technologii, dzięki której programista napisze interfejs dla DAO (metody wyszukiwania) i klasy encji w sposób niezależny od technologii i tylko w oparciu o konfigurację (adnotacje dotyczące DAO i encji + konfiguracja sprężynowa, czy to xml lub java), decyduje o technologii implementacji, czy to JPA (SQL), czy redis, hadoop itp. (NOSQL).
Jeśli zastosujesz się do konwencji nazewnictwa zdefiniowanych przez wiosnę dla nazw metod wyszukiwania, nie musisz nawet podawać ciągów zapytań odpowiadających metodom wyszukiwania w najprostszych przypadkach. W innych sytuacjach musisz podać ciąg zapytania w adnotacjach w metodach wyszukiwania.
Po załadowaniu kontekstu aplikacji spring udostępnia serwery proxy dla interfejsów DAO, które zawierają cały standardowy kod związany z technologią dostępu do danych, i wywołuje skonfigurowane zapytania.
Spring-Data koncentruje się na technologiach innych niż SQL, ale nadal dostarcza moduł dla JPA (jedyna technologia SQL).
Co dalej
Wiedząc to wszystko, musisz teraz zdecydować, co wybrać. Dobra wiadomość jest taka, że nie musisz podejmować ostatecznego ostatecznego wyboru technologii. W tym właśnie tkwi siła Springa: jako programista, pisząc kod, koncentrujesz się na biznesie, a jeśli robisz to dobrze, zmiana podstawowej technologii to implementacja lub szczegół konfiguracji.
- Zdefiniuj model danych z klasami POJO dla jednostek i pobierz / ustaw metody reprezentujące atrybuty jednostki i relacje z innymi jednostkami. Z pewnością będziesz musiał dodać adnotacje do klas encji i pól w oparciu o technologię, ale na razie wystarczy POJO, aby zacząć. Skoncentruj się na razie na wymaganiach biznesowych.
- Zdefiniuj interfejsy dla swoich DAO. 1 DAO obejmuje dokładnie 1 obiekt, ale z pewnością nie będziesz potrzebować DAO dla każdego z nich, ponieważ powinieneś być w stanie załadować dodatkowe encje, nawigując po relacjach. Zdefiniuj metody wyszukiwania zgodnie ze ścisłymi konwencjami nazewnictwa.
- Na tej podstawie ktoś inny może rozpocząć pracę nad warstwą usług z makietami dla Twoich DAO.
- Uczysz się różnych technologii trwałości (sql, no-sql), aby znaleźć najlepszą dla swoich potrzeb i wybierz jedną z nich. Na tej podstawie możesz dodawać adnotacje do encji i wdrażać DAO (lub pozwalasz Springowi zaimplementować je za Ciebie, jeśli zdecydujesz się użyć danych sprężynowych).
- Jeśli wymagania biznesowe ewoluują, a Twoja technologia dostępu do danych nie jest wystarczająca do ich obsługi (powiedzmy, że zacząłeś od JDBC i kilku podmiotów, ale teraz potrzebujesz bogatszego modelu danych, a JPA jest lepszym wyborem), będziesz musiał zmienić implementację swoich DAO, dodaj kilka adnotacji do swoich encji i zmień konfigurację sprężyny (dodaj definicję EntityManagerFactory). W pozostałej części kodu biznesowego zmiana nie powinna mieć innych skutków.
Uwaga: zarządzanie transakcjami
Spring udostępnia API do zarządzania transakcjami. Jeśli planujesz wykorzystać spring do dostępu do danych, powinieneś również użyć spring do zarządzania transakcjami, ponieważ bardzo dobrze się ze sobą integrują. Dla każdej technologii dostępu do danych obsługiwanej przez wiosnę istnieje dopasowany menedżer transakcji dla transakcji lokalnych lub możesz wybrać JTA, jeśli potrzebujesz transakcji rozproszonych. Wszystkie implementują to samo API, więc (po raz kolejny) wybór technologii to tylko kwestia konfiguracji, którą można zmienić bez dalszego wpływu na kod biznesowy.
Uwaga: dokumentacja sprężynowa
Odnośniki do dokumentacji Springa, o których wspomniałeś, są dość stare. Oto dokumentacja najnowszej wersji (4.1.6, obejmująca wszystkie tematy):
Spring-data nie jest częścią struktury Spring. Istnieje wspólny moduł, który należy najpierw przeczytać, aby przyzwyczaić się do zasad. Dokumentację można znaleźć tutaj: