Üçüncü moduldan frontend proyektini xatırlayırsınızmı, burada server API üçün RPG üçün admin panelini həyata keçirməli idik? Xatırlayan varsa - serverdə saxlama olaraq xəritə istifadə olunurdu. Əlbəttə ki, real həyatda belə saxlama yerlərindən istifadə edilmir, əvəzinə verilənlər bazasından istifadə edilir. Bu proyektin məqsədi Hibernate istifadə edərək repository qatını alternativ olaraq həyata keçirmək olacaq.
Bunun üçün lazımdır:
- Repozitoriyadan fork edin
- Layihənin öz versiyasını kompüterə yükləyin.
- pom.xml-ə asılılıqları əlavə edin:
- mysql: mysql-connector-java: 8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Maven build edin (mvn clean install). Müxtəliflik üçün Java versiyası 1.8 istifadə edəcəyik.
- İdeya vasitəsilə işə salma konfiqurasiyasını əlavə edin. Bu addımın həyata keçirilməsini dərsdə burada görə bilərsiniz https://javarush.com/quests/lectures/jru.module3.lecture02 (addım 4). Tək fərq - fərqli artefakt adı. Hər şeyi düzgün edib tətbiqi işə salırsınızsa, təxmini belə bir görüntü ilə qarşılaşacaqsınız:
- Workbench-də RPG sxemini yaratmaq üçün skripti icra edin:
CREATE SCHEMA `rpg` ;
- Opsional. Gözlənilən davranışı görmək istəyirsinizsə,
com.game.service.PlayerService
sinifində @Qualifier annotasiyasının dəyərini "db" əvəzinə "memory" olaraq dəyişə bilərsiniz. Bu halda, SpringIPlayerRepository
interfeysini həyata keçirmək üçünPlayerRepositoryMemory
sinifini istifadə edəcək. Testdən sonra annotasiya@Qualifier
dəyərini yenidən "db" olaraq dəyişməyi unutmayın. com.game.entity.Player
eniti sinifində bütün zəruri annotasiyaları yerləşdirin. Cədvəl "player", sxem isə "rpg" adlanmalıdır. Enumlar üçün@Enumerated(EnumType.ORDINAL)
istifadə edin,@Column
annotasiyasını da əlavə edin. Xatırladım ki, name sahəsinin uzunluğu 12 simvola qədər, title sahəsi isə 30 simvola qədər olmalıdır. Bütün sahələr null olmamalıdır.PlayerRepositoryDB
sinifində private finalSessionFactory sessionFactory
sahəsini əlavə edin, və bu sahəni sinifin konstruktorunda initializasiya edin. Propertyləri adi məsələlərdəki kimi istifadə edin (MySQL versiya 8 ilə işləyəcəyik). Maraqlı olan isə
Buraxmadan əl ilə (ya da sql skripti icra etməklə) cədvəli yaratmağa ehtiyac qalmayacaq.properties.put(Environment.HBM2DDL_AUTO, "update");
- Sınıfın bütün metodlarını həyata keçirin. Müxtəliflik üçün belə etməyi təklif edirəm:
getAll
metoduNativeQuery
vasitəsilə həyata keçirilsin - bu metodpageNumber
- səhifə nömrəsi,pageSize
- səhifədəki qeydlərin sayı parametrlərini nəzərə alaraq bütün oyunçuları almalıdır.getAllCount
metoduNamedQuery
vasitəsilə həyata keçirilsin. Verilənlər bazasında olan bütün oyunçuların sayını qaytarmalıdır.beforeStop
metodundasessionFactory
metodunu çağırclose
. Metod üzərində@PreDestroy
annotasiyası olduğuna görə Spring bu metodu tətbiqin dayandırılması öncəsi çağıracaq və bu sistemin bütün resurslarını düzgün şəkildə azad etməyə imkan verəcək.- Qalan metodların həyata keçirilməsi sənin ixtiyarındadır. Ancaq, dəyişiklik edən metodlar üçün tranzaksiyalar və kommitlər etməyi unutma.
- Tətbiqi işə salın. Hər şeyi düzgün etmisinizsə - işlək bir tətbiq əldə edəcəksiniz. Ancak orada heç bir məlumat yoxdur, ona görə də məlumatların görünməsi üçün Workbench vasitəsilə init.sql skriptini (resurslardan) icra edin. Sonra brauzerdə F5 düyməsini bas və bütün metodların doğru həyata keçirildiyini yoxlayın.
- Hibernate'in hansı sorğuları vasitəsilə həyata keçirildiyini maraqlı olar baxmaq, buna görə sorğuların loglaşdırılmasını əlavə edəcəyik. Bunun üçün pom.xml-ə p6spy:p6spy:3.9.1 asılılığını əlavə edin. Resurs qovluğunda spy.properties faylını yaradın, burada qeyd edərək:
Və PlayerRepositoryDB sinifinin konstruktorunda iki seçimi dəyişin: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
İndi hər sorğu üçün server çıxışında 2 xətt görəcəksiniz. Birinci - hansı state hazırlanıb, ikinci - parametrlərlə birgə sorğu.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Budur, layihə hazırdır, təbrik edirəm səni!
Əslində, Hibernate ilə Spring-dən iş üçün başqa bir yanaşma istifadə olunur, bu barədə beşinci modulda danışacağıq.
Layihənin analizi.
GO TO FULL VERSION