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.PlayerServicewartość 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” .@QualifierIPlayerRepositoryPlayerRepositoryMemory@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. PlayerRepositoryDBDodaj 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ę
getAllprzezNativeQuery - Zaimplementuj metodę
getAllCountprzezNamedQuery - W metodzie
beforeStopwywołajsessionFactorymetodę 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