DAO vs obrasci spremišta
Često se implementacije spremišta i DAO smatraju zamjenjivima, posebno u aplikacijama usmjerenim na podatke. To stvara zbrku oko njihovih razlika.
U ovom ćemo članku razgovarati o razlikama između obrazaca DAO i Repozitorija.
2. DAO obrazac
Uzorak objekta pristupa podacima, zvani DAO obrazac, je apstrakcija postojanosti podataka i smatra se bližim osnovnoj pohrani, koja je često usmjerena na tablice.
Stoga se u mnogim slučajevima naši DAO podudaraju s tablicama baze podataka, što omogućuje jednostavniji način slanja / preuzimanja podataka iz pohrane, skrivajući ružne upite.
Ispitajmo jednostavnu provedbu DAO uzorka.
2.1. Korisnik
Prvo, stvorimo osnovno Korisnik klasa domene:
korisnik javne klase {private Long id; privatni niz userName; private String firstName; privatni String e-mail; // geteri i postavljači}
2.2. UserDao
Zatim ćemo stvoriti UserDao sučelje koje pruža jednostavne CRUD operacije za Korisnik domena:
javno sučelje UserDao {void create (User user); Korisničko čitanje (dugi ID); ažuriranje praznine (Korisnički korisnik); brisanje praznine (niz userName); }
2.3. UserDaoImpl
Na kraju ćemo stvoriti UserDaoImpl klasa koja provodi UserDao sučelje:
javna klasa UserDaoImpl implementira UserDao {privatni konačni EntityManager entityManager; @Override public void create (User user) {entityManager.persist (user); } @Override public User read (long id) {return entityManager.find (User.class, id); } // ...}
Ovdje smo radi jednostavnosti koristili JPA EntityManager sučelje za interakciju s osnovnom pohranom i pružanje mehanizma za pristup podacima za Korisnik domena.
3. Uzorak spremišta
Po knjizi Erica Evansa Dizajn vođen domenom, "Spremište je mehanizam za enkapsulaciju pohrane, dohvaćanja i ponašanja prilikom pretraživanja, koji oponaša zbirku objekata."
Isto tako, prema Uzorci arhitekture poslovnih aplikacija, to "Posreduje između slojeva mape domene i podataka koristeći sučelje nalik zbirci za pristup objektima domene."
Drugim riječima, spremište se također bavi podacima i skriva upite slične DAO-u. Međutim, nalazi se na višoj razini, bliže poslovnoj logici aplikacije.
Slijedom toga, spremište može koristiti DAO za dohvaćanje podataka iz baze podataka i popunjavanje objekta domene. Ili može pripremiti podatke iz objekta domene i poslati ih u sustav za pohranu pomoću DAO-a radi trajnosti.
Ispitajmo jednostavnu implementaciju uzorka Spremišta za Korisnik domena.
3.1. UserRepository
Prvo, kreirajmo UserRepository sučelje:
javno sučelje UserRepository {User get (Long id); void add (Korisnik korisnik); ažuriranje praznine (Korisnički korisnik); uklanjanje praznine (Korisnik korisnik); }
Evo, dodali smo nekoliko uobičajenih metoda poput dobiti, dodati, ažuriranje, i ukloniti za rad sa zbirkom predmeta.
3.2. UserRepositoryImpl
Zatim ćemo stvoriti UserRepositoryImpl razred koji osigurava provedbu UserRepository sučelje: Evo, koristili smo UserDaoImpl za slanje / preuzimanje podataka iz baze podataka. Do sada možemo reći da implementacije DAO-a i spremišta izgledaju vrlo slično jer Korisnik klasa je anemična domena. A spremište je samo još jedan sloj preko sloja pristupa podacima (DAO). Međutim, DAO se čini savršenim kandidatom za pristup podacima, a spremište je idealan način za primjenu slučaja poslovne upotrebe. Da bismo jasno razumjeli posljednju izjavu, unaprijedimo našu Korisnik domena za rješavanje poslovnog slučaja. Zamislite da želimo pripremiti profil na društvenim mrežama za korisnika agregiranjem njegovih Twitter tweetova, postova na Facebooku i još mnogo toga. Prvo ćemo stvoriti Cvrkut razred s nekoliko svojstava koja sadrže informacije o tweetu: Zatim, slično kao UserDao, mi ćemo stvoriti TweetDao sučelje koje omogućuje dohvaćanje tweetova: Isto tako, mi ćemo stvoriti TweetDaoImpl klasa koja osigurava provedbu fetchTweets metoda: Ovdje ćemo nazvati Twitter API-je kako bi korisnik dohvatio sve tweetove putem svoje e-pošte. Dakle, u ovom slučaju DAO pruža mehanizam za pristup podacima koristeći API-je nezavisnih proizvođača. Na kraju, kreirajmo UserSocialMedia podrazred našeg Korisnik razreda kako bi se vodio popis Cvrkut objekti: Evo, naša UserSocialMedia klasa je složena domena koja sadrži svojstva Korisnik domena također. Sada ćemo nadograditi naš UserRepositoryImpl razred pružiti a Korisnik objekt domene zajedno s popisom tweetova: Evo, UserRepositoryImpl izvlači korisničke podatke pomoću UserDaoImpl i korisnikove tweetove pomoću TweetDaoImpl. Zatim objedinjuje oba skupa informacija i pruža objekt domene UserSocialMedia klase koja je korisna za naš poslovni slučaj. Stoga, spremište se oslanja na DAO za pristup podacima iz različitih izvora. Slično tome, možemo poboljšati svoj Korisnik domena za čuvanje popisa Facebook postova. Sad kad smo vidjeli nijanse DAO i Repozitorij uzoraka, sažejmo njihove razlike: Također, ako imamo anemičnu domenu, spremište će biti samo DAO. Dodatno, obrazac spremišta potiče dizajn vođen domenom, pružajući lako razumijevanje strukture podataka i članovima netehničkog tima. U ovom smo članku istražili razlike između obrazaca DAO i Repozitorija. Prvo smo ispitali osnovnu provedbu DAO uzorka. Zatim smo vidjeli sličnu implementaciju koristeći obrazac Repozitorija. Na kraju, pogledali smo Spremište koje koristi više DAO-a, poboljšavajući mogućnosti domene za rješavanje slučaja poslovne upotrebe. Stoga možemo zaključiti da obrazac Repozitorija pokazuje bolji pristup kada se aplikacija premjesti iz podatkovno usmjerene u poslovno orijentiranu. Kao i obično, sve implementacije koda dostupne su na GitHubu.javna klasa UserRepositoryImpl implementira UserRepository {private UserDaoImpl userDaoImpl; @Override public User get (Long id) {User user = userDaoImpl.read (id); povratni korisnik; } @Override public void add (User user) {userDaoImpl.create (user); } // ...}
4. Uzorak spremišta s više DAO-a
4.1. Cvrkut
javna klasa Tweet {private String email; private String tweetText; privatno Date dateCreate; // geteri i postavljači}
4.2. TweetDao i TweetDaoImpl
javno sučelje TweetDao {Popis fetchTweets (niz e-pošte); }
javna klasa TweetDaoImpl implementira TweetDao {@Override javni popis fetchTweets (String email) {List tweets = new ArrayList (); // nazovite Twitter API i pripremite tweetove za povrat objekata Twitter; }}
4.3. Poboljšajte Korisnik Domena
javna klasa UserSocialMedia proširuje tweetove User {private List; // geteri i postavljači}
4.4. UserRepositoryImpl
javna klasa UserRepositoryImpl implementira UserRepository {private UserDaoImpl userDaoImpl; privatno TweetDaoImpl tweetDaoImpl; @Override public User get (Long id) {UserSocialMedia user = (UserSocialMedia) userDaoImpl.read (id); Popis tweetova = tweetDaoImpl.fetchTweets (user.getEmail ()); user.setTweets (tweetovi); povratni korisnik; }}
5. Usporedba dva uzorka
6. Zaključak