Ostatnim elementem, który dodamy do naszego systemu będzie tzw. repozytorium. Wzorzec projektowy Repository pozwala opakować zarządzanie dostępem do bazy danych w dodatkową warstwę abstrakcji. Warstwa serwisu zamiast korzystać bezpośrednio z DAO, może wykonywać operacje na repozytorium i traktować zarządzanie encjami tak jakby stanowiły kolekcję danych. Pozwala to na dodatkowe uporządkowanie odpowiedzialności.
Zadania
-
Zapoznaj się z poniższym kodem i wklej go do projektu - możesz umieścić interfejs
Repositoryw pakieciepl.edu.agh.iisg.to.repository:import pl.edu.agh.iisg.to.model.Student; import java.util.List; import java.util.Optional; public interface Repository<T> { Optional<T> add(T student); Optional<T> getById(int id); List<T> findAll(); void remove(T student); } -
W tym samym pakiecie stwórz klasę
StudentRepositoryi zaimplementuj interfejsRepository<Student>. -
Wypełnij logikę wymaganych przez interfejs metod
add(),getById()orazfindAll(). W tym celu posłuż sięStudentDao- klasaStudentRepositorypowinna przyjmować obiektStudentDaoi z niego korzystać. -
Dodaj logikę dla metody
remove(). Zastanów się, który fragmentSchoolServicemożna by tu wykorzystać. -
Do stworzonego
StudentRepositorydodaj jeszcze jedną metodę:public List<Student> findAllByCourseName(String courseName) { ... }Zaimplementuj tę metodę. W razie potrzeby pamiętaj, że w repozytorium możesz użyć więcej niż jednego DAO!
-
Zmodyfikuj kod
SchoolServicetak by przechowywał on obiektStudentRepository. Postaraj się maksymalnie wykorzystać repozytorium zastępując istniejącą logikę w przygotowanych wcześniej metodach. Na koniec pamiętaj by zmodyfikować atrybuty w klasieOrmTesttak by testy mogły się zbudować. Modyfikowanie kodu samych testów nie powinno być potrzebne.💡W jaki sposób wykorzystanie repozytorium upraszcza kod
SchoolService? Jaki inny wzorzec projektowy w ten sposób realizujemy?Odpowiedź - kliknij
SchoolRepositorypozwala na pozycie się zależności odStudentDaoiCourseDaow kodzie logiki biznesowej. Zamiast tego mamy jedno repozytorium, które zarządza dostępem do studentów. Repozytorium staje się w ten sposób fasadą, ukrywającą szczegóły implementacji dostępu do bazy.Uwaga: w szczególnych, protszych przypadkach DAO będzie tym samym co Repository. Np.
GradeDaomogłoby implementowaćRepository<Grade>, bo w obecnej sytuacji repozytorium ocen nie potrzebowałoby żadnych dodatkowych zależności i metod.