DAO vs obrasci spremišta

1. Pregled

Č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:

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); } // ...}

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.

4. Uzorak spremišta s više DAO-a

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.

4.1. Cvrkut

Prvo ćemo stvoriti Cvrkut razred s nekoliko svojstava koja sadrže informacije o tweetu:

javna klasa Tweet {private String email; private String tweetText; privatno Date dateCreate; // geteri i postavljači}

4.2. TweetDao i TweetDaoImpl

Zatim, slično kao UserDao, mi ćemo stvoriti TweetDao sučelje koje omogućuje dohvaćanje tweetova:

javno sučelje TweetDao {Popis fetchTweets (niz e-pošte); }

Isto tako, mi ćemo stvoriti TweetDaoImpl klasa koja osigurava provedbu fetchTweets metoda:

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; }}

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.

4.3. Poboljšajte Korisnik Domena

Na kraju, kreirajmo UserSocialMedia podrazred našeg Korisnik razreda kako bi se vodio popis Cvrkut objekti:

javna klasa UserSocialMedia proširuje tweetove User {private List; // geteri i postavljači}

Evo, naša UserSocialMedia klasa je složena domena koja sadrži svojstva Korisnik domena također.

4.4. UserRepositoryImpl

Sada ćemo nadograditi naš UserRepositoryImpl razred pružiti a Korisnik objekt domene zajedno s popisom tweetova:

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; }}

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.

5. Usporedba dva uzorka

Sad kad smo vidjeli nijanse DAO i Repozitorij uzoraka, sažejmo njihove razlike:

  • DAO je apstrakcija postojanosti podataka. Međutim, spremište je apstrakcija zbirke predmeta
  • DAO je koncept niže razine, bliži sustavima za pohranu. Međutim, Repozitorij je koncept više razine, bliži objektima Domene
  • DAO radi kao sloj za mapiranje podataka / pristup, skrivajući ružne upite. Međutim, spremište je sloj između domena i slojeva pristupa podacima koji skriva složenost uspoređivanja podataka i pripreme objekta domene
  • DAO se ne može implementirati pomoću spremišta. Međutim, spremište može koristiti DAO za pristup temeljnoj pohrani

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.

6. Zaključak

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.