Pamiętacie projekt z trzeciego modułu na frontendzie, gdzie trzeba było zaimplementować panel admina rpg dla API serwera? Jeśli ktoś pamięta, mapa była używana jako magazyn na serwerze. Oczywiście w prawdziwym życiu takie magazyny nie są używane, ale używane są bazy danych. Celem tego projektu będzie napisanie alternatywnej implementacji warstwy repozytorium przy użyciu Hibernate.
Do tego potrzebujesz:
- Fork z repozytorium
- Pobierz swoją wersję projektu na swój komputer.
- Dodaj zależności do pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Utwórz kompilację maven (mvn clean install). Dla odmiany używamy Javy w wersji 1.8.
- Dodaj konfigurację uruchamiania za pośrednictwem Idea. Implementację tego elementu można znaleźć w wykładzie https://codegym.cc/quests/lectures/cgu.module3.lecture02 (punkt 4). Jedyną różnicą jest inna nazwa artefaktu. Jeśli zrobiłeś wszystko poprawnie i uruchomiłeś aplikację, zobaczysz coś takiego:
- Uruchom skrypt tworzenia schematu rpg w Workbench:
CREATE SCHEMA `rpg` ;
- Opcjonalne . Jeśli chcesz zobaczyć, jakie zachowanie jest oczekiwane, możesz zmienić
com.game.service.PlayerService
wartość adnotacji z „db” na „memory” w klasie w parametrze konstruktora . W takim przypadku Spring użyje . Po teście nie zapomnij zmienić wartości adnotacji z powrotem na „db” .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Uporządkuj wszystkie niezbędne adnotacje w klasie encji
com.game.entity.Player
. Tabela powinna mieć nazwę „player”, schemat „rpg”. W przypadku enamów użyj@Enumerated(EnumType.ORDINAL)
oprócz adnotacji@Column
. Przypomnę, że długość pola nazwy powinna wynosić do 12 znaków, pole tytułu - do 30 znaków. Absolutnie wszystkie pola nie mogą być puste. PlayerRepositoryDB
Dodaj prywatne pole końcowe w klasieSessionFactory sessionFactory
, zainicjuj to pole w konstruktorze klasy. Użyj właściwości jak w normalnych zadaniach (będziemy pracować z bazą danych MySQL w wersji 8). Z ciekawych - dodaj
Pozwoli ci to nie tworzyć tabeli ręcznie (lub poprzez wykonanie skryptu sql).properties.put(Environment.HBM2DDL_AUTO, "update");
- Zaimplementuj wszystkie metody klasowe. Dla odmiany zróbmy tak:
- Zaimplementuj metodę
getAll
przezNativeQuery
- Zaimplementuj metodę
getAllCount
przezNamedQuery
- W metodzie
beforeStop
wywołajsessionFactory
metodę yclose
. Mając adnotację na metodzie@PreDestroy
, Spring wywoła tę metodę przed zatrzymaniem aplikacji, co pozwoli na prawidłowe zwolnienie wszystkich zasobów systemowych. - Wdrożenie innych metod zależy od Ciebie. Ale nie zapomnij o transakcjach i zatwierdzeniach dla metod, które w jakiś sposób zmieniają zawartość bazy danych.
- Uruchom aplikację. Jeśli zrobiłeś wszystko dobrze, otrzymasz działającą aplikację. Ale nie ma tam danych, więc uruchom skrypt init.sql (z zasobów) przez Workbench, aby się pojawiły. Następnie naciśnij klawisz F5 w przeglądarce i sprawdź, czy poprawnie zaimplementowałeś wszystkie metody.
- Byłoby interesujące zobaczyć dokładnie, jakie zapytania wykonuje Hibernate, więc dodajmy rejestrowanie zapytań. Aby to zrobić, dodaj zależność p6spy:p6spy:3.9.1 do pom.xml . W folderze zasobów utwórz plik spy.properties , w którym określ:
A w konstruktorze klasy PlayerRepositoryDB zmień dwie opcje:driverlist=com.mysql.cj.jdbc.Driver dateformat=yyyy-MM-dd hh:mm:ss a appender=com.p6spy.engine.spy.appender.StdoutLogger logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
Teraz w danych wyjściowych serwera dla każdego żądania zobaczysz 2 wiersze. Pierwsza to jaka instrukcja jest przygotowywana, druga to zapytanie z wstawionymi parametrami.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
To wszystko, projekt jest gotowy, gratulacje!
W rzeczywistości praca z Hibernate od Springa wykorzystuje inne podejście, które omówimy w piątym module.
Analiza projektu.
GO TO FULL VERSION