Kan du huske projektet fra det tredje modul på frontend, hvor det var nødvendigt at implementere et rpg-adminpanel til server-API'en? Hvis nogen husker det, blev et kort brugt som lager på serveren. Naturligvis, i det virkelige liv, bruges sådanne lagre ikke, men databaser bruges. Målet med dette projekt vil være at skrive en alternativ lagerimplementering ved hjælp af Hibernate.
Til dette har du brug for:
- Gaffel fra et depot
- Download din version af projektet til din computer.
- Tilføj afhængigheder til pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Lav en maven build (mvn clean install). Til en forandring bruger vi Java version 1.8.
- Tilføj lanceringskonfiguration via Idé. Implementeringen af dette punkt kan findes i foredraget https://codegym.cc/quests/lectures/cgu.module3.lecture02 (punkt 4). Den eneste forskel er et andet navn for artefakten. Hvis du gjorde alt rigtigt og startede programmet, vil du se noget som dette:
- Kør scriptet til oprettelse af rpg-skema i Workbench:
CREATE SCHEMA `rpg` ;
- Valgfrit . Hvis du vil se, hvilken adfærd der forventes, kan du ændre
com.game.service.PlayerService
annotationsværdien fra "db" til "hukommelse" i klassen i konstruktørparameteren . I dette tilfælde vil Spring bruge . Efter testen, glem ikke at ændre annotationsværdien tilbage til "db" .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Arranger alle de nødvendige anmærkninger i enhedsklassen
com.game.entity.Player
. Tabellen skal hedde "player", skema "rpg". For enams, brug@Enumerated(EnumType.ORDINAL)
ud over annoteringen@Column
. Lad mig minde dig om, at længden af navnefeltet skal være op til 12 tegn, titelfeltet - op til 30 tegn. Absolut alle felter må ikke være null. PlayerRepositoryDB
Tilføj et privat sidste felt i klassenSessionFactory sessionFactory
, initialiser dette felt i klassekonstruktøren. Brug egenskaber som i normale opgaver (vi vil arbejde med MySQL-databasen version 8). Fra interessant - tilføj
Dette vil tillade dig ikke at oprette en tabel manuelt (eller gennem udførelse af et sql-script).properties.put(Environment.HBM2DDL_AUTO, "update");
- Implementer alle klassemetoder. For en forandring, lad os gøre dette:
- Implementer metoden
getAll
viaNativeQuery
- Implementer metoden
getAllCount
viaNamedQuery
beforeStop
Kald y- metoden isessionFactory
metodenclose
. Ved at have en annotering på metoden@PreDestroy
vil Spring kalde denne metode, før den stopper applikationen, og dette vil give dig mulighed for gyldigt at frigive alle systemressourcer.- Implementeringen af andre metoder er op til dig. Men glem ikke transaktioner og tilsagn om metoder, der på en eller anden måde ændrer indholdet af databasen.
- Start applikationen. Hvis du gjorde alt rigtigt, får du en fungerende ansøgning. Men der er ingen data der, så kør init.sql- scriptet (fra ressourcer) gennem Workbench, så de vises. Tryk derefter på F5 i browseren og kontroller, at du har implementeret alle metoderne korrekt.
- Det ville være interessant at se præcis, hvilke forespørgsler Hibernate udfører, så lad os tilføje forespørgselslogning. For at gøre dette skal du tilføje p6spy:p6spy:3.9.1- afhængigheden til pom.xml . I ressourcemappen skal du oprette en fil spy.properties , hvori angives:
Og i konstruktøren af PlayerRepositoryDB-klassen skal du ændre to muligheder: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
Nu vil du se 2 linjer i serveroutputtet for hver anmodning. Den første er, hvilken sætning der er forberedt, den anden er forespørgslen med de indsatte parametre.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Det er alt, projektet er klar, tillykke!
Faktisk bruger arbejdet med Hibernate fra Spring en anden tilgang, som vi vil dække i det femte modul.
Projektanalyse.
GO TO FULL VERSION