DAO (Data Access Object) jak Repository dostarczają interfejs umożliwiający komunikacje ze źródłem danych. Rozwiązania takie nazywane są Data Access Layer (DAL). Przy czym DAO jest rozwiązaniem bardziej elastycznym, natomiast Reposiotry nowszym i preferowanym do wykorzystania przez twórców wielu frameworków np. Spring Framework.
Data Access Layer
Aplikacje zorientowane obiektowo, które uzyskują dostęp do bazy danych, muszą mieć logikę do obsługi dostępu do bazy danych. Aby kod był czysty i modułowy, zaleca się, aby logika dostępu do bazy danych była izolowana w oddzielnym module. W architekturze warstwowej ten moduł to DAL.
Repository
Repository – pozwala na zarządzanie dostępem do danych i wykonywanie różnorodnych operacji na konkretnym typie danych. Z repozytorium jest ściśle powiązany model danych. Przy jego wykorzystywaniu zagadnienia powiązane z konkretną bazą danych.
Repozytorium przechowuje wszystkie dane w tej samej tabeli. Dlatego z konkretnym repozytorium powiązany jest dany model, który przekłada się na jedną tabelę. Przykładowo model User posiada repozytorium UserRepository i odzwierciedlany jest w postaci jednej tabeli user.
Głównym punktem wzorca repozytorium jest to, że z perspektywy użytkowania powinien zachowywać się jak kolekcja – obsługiwać takie operacje, jak dodawanie, usuwanie, zawieranie, modyfikowanie itp. Przykład interfejsu jaki powinien posiadać repozytorium:
public interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterable<S> saveAll(Iterable<S> var1); Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); void deleteById(ID var1); void delete(T var1); void deleteAll(Iterable<? extends T> var1); void deleteAll(); }
Data Access Object
DAO – obiekt dostępu do danych. Jest to klasa, która pozwala na pobieranie, dodawanie, usuwanie i modyfikowanie danych. Obiekt ten nie jest ograniczony do przechowywania konkretnego typu danych. Z jego wykorzystaniem można operować na wielu typach danych. Daje to wysoką elastyczność.
Jednak ze względu na utrzymanie kodu dobrego jakościowo każda encja ma przyporządkowane swoje DAO np. User/UserDao, Animal/AnimalDao.
Czasami robi się odstępstwa i rzeczy powiązane z encją Animal np. Shelter mogą być ujęte w tym samym DAO np.:
Iterable<Shelter> findShelterForAnimal(String animalId); Animal findAnimal(String userId); Iterable<Animal> findAnimalByShelter(Shelter shelter);
Uwaga
Repozytorium nie jest czymś co powstaje na DAO (jak niektóre źródła sugerują). Jeśli DAL posiada interfejs, który umożliwia operowanie na danych jak na kolekcji wówczas stanowi on implementacje wzorca Repository i nie jest on DAO.
Podsumowanie
Oba podejścia realizują to samo. Sposób ich użycia może być nieco inny, ponieważ DAO jest bardziej elastyczne/ogólne, podczas gdy repozytorium jest bardziej szczegółowe i ogranicza się tylko do danego typu.
Repozytorium jest koncepcją wyższego poziomu zajmującą się bezpośrednio obiektami biznesowymi/domenowymi. Jest to bardziej naturalne dla podejścia DDD.
DAO stanowi niższym poziom jest bliższy bazie danych/pamięci, które odpowiadają za przechowywanie danych.