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:

  1. Fork z repozytorium
  2. Pobierz swoją wersję projektu na swój komputer.
  3. Dodaj zależności do pom.xml:
    • mysql:mysql-connector-java:8.0.30
    • org.hibernate: hibernate-core-jakarta: 5.6.11.Final
  4. Utwórz kompilację maven (mvn clean install). Dla odmiany używamy Javy w wersji 1.8.
  5. 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:
  6. Uruchom skrypt tworzenia schematu rpg w Workbench:
    CREATE SCHEMA `rpg` ;
    
  7. 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
  8. 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.
  9. PlayerRepositoryDBDodaj prywatne pole końcowe w klasie SessionFactory 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
    properties.put(Environment.HBM2DDL_AUTO, "update");
    
    Pozwoli ci to nie tworzyć tabeli ręcznie (lub poprzez wykonanie skryptu sql).
  10. Zaimplementuj wszystkie metody klasowe. Dla odmiany zróbmy tak:
    • Zaimplementuj metodę getAllprzezNativeQuery
    • Zaimplementuj metodę getAllCountprzezNamedQuery
    • W metodzie beforeStopwywołaj sessionFactorymetodę y close. 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.
  11. 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.
  12. 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:
    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
    
    A w konstruktorze klasy PlayerRepositoryDB zmień dwie opcje:
    properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver");
    properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
    
    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.

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.