Пам'ятаєте проект із третього модуля по фронтенду, де потрібно було реалізувати адмінку для rpg для серверного API? Якщо хтось пам'ятає – там на сервері як сховище використовувалася карта. Звичайно, у реальному житті такі сховища не використовують, а використовують бази даних. Метою цього проекту буде написати альтернативну реалізацію шару репозиторію з використанням Hibernate.
Для цього потрібно:
- Зробити fork з репозиторію
- Завантажити свою версію проекту на комп'ютер.
- Додати залежності в pom.xml:
- mysql: mysql-connector-java: 8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Зробити maven білд (mvn clean install). Для різноманітності використовуємо Java версії 1.8.
- Додати конфігурацію запуску через Ідею. Реалізацію цього пункту можна переглянути в лекції https://codegym.cc/quests/lectures/jru.module3.lecture02 (пункт 4). Єдина відмінність – інша назва артефакту. Якщо все зробив правильно і запустив програму – побачиш приблизно таку картину:
- У Workbench виконати скрипт створення схеми rpg:
CREATE SCHEMA `rpg` ;
- Опціонально . Якщо хочеш подивитися яку очікується поведінку, можеш у класі
com.game.service.PlayerService
в параметрі конструктора значення інструкції@Qualifier
змінити з «db» на «memory» . У цьому випадку Spring буде використовувати як реалізації інтерфейсуIPlayerRepository
класPlayerRepositoryMemory
. Після тесту не забудь змінити значення інструкції@Qualifier
назад на «db» . - Розставити всі необхідні інструкції в ентіті-класі
com.game.entity.Player
. Таблиця має називатися "player", схема "rpg". Для єнамів використовуй@Enumerated(EnumType.ORDINAL)
крім анотації@Column
. Нагадаю, що довжина поля name має бути до 12 символів, поля title – до 30 символів. Абсолютно всі поля не повинні бути null. - У класі
PlayerRepositoryDB
додай private final полеSessionFactory sessionFactory
, у конструкторі класу ініціалізуй це поле. Проперти використовуй як у звичайних завданнях (працюватимемо з БД MySQL версії 8). З цікавого – додай
Це дозволить не створювати таблицю вручну (або через виконання SQL скрипта).properties.put(Environment.HBM2DDL_AUTO, "update");
- Реалізуй усі методи класу. Для різноманітності давай вчинимо так:
- Метод
getAll
реалізуй черезNativeQuery
- Метод
getAllCount
реалізуй черезNamedQuery
- У методі
beforeStop
виклич уsessionFactory
методclose
. За рахунок наявності анотації над методом@PreDestroy
Spring викличе цей метод перед зупинкою програми, і це дозволить валідно звільнити всі ресурси системи. - Реалізація інших методів на твій розсуд. Але не забувай про транзакції та коміти для методів, які як або змінюють вміст БД.
- Запусти програму. Якщо все зробив правильно – ти отримаєш робочу програму. Ось тільки даних там немає, так що виконай через Workbench скрипт init.sql (з ресурсів), щоб вони з'явабося. Після цього в браузері натисніть на F5 і перевіряй, що всі методи ти реалізував правильно.
- Було б цікаво подивитись, які саме запити виконує Hibernate, тому додамо логування запитів. Для цього додай в pom.xml залежність p6spy: p6spy: 3.9.1 . У папці ресурсів створи файл spy.properties , в якому вкажи:
І в конструкторі класу PlayerRepositoryDB зміни дві опції: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
Тепер у виведенні сервера по кожному запиту ти бачитимеш 2 рядки. Перша – який стейтмент підготовлений, другий – запит із вставленими параметрами.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Ось і все, проект готовий, вітаю тебе!
Насправді, для роботи з Hibernate із Spring використовується інший підхід, про який ми розповімо у п'ятому модулі.
Розбір проекту.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ