Kommer du ihåg projektet från den tredje modulen på frontend, där det var nödvändigt att implementera en rpg-adminpanel för serverns API? Om någon kommer ihåg användes en karta som lagring på servern. Naturligtvis, i verkliga livet, används inte sådana lagringar, men databaser används. Målet med detta projekt kommer att vara att skriva en alternativ förvarslagerimplementering med Hibernate.
För detta behöver du:
- Gaffel från ett förråd
- Ladda ner din version av projektet till din dator.
- Lägg till beroenden till pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Gör ett mavenbygge (mvn clean install). För en förändring använder vi Java version 1.8.
- Lägg till startkonfiguration via Idé. Implementeringen av detta objekt finns i föreläsningen https://codegym.cc/quests/lectures/cgu.module3.lecture02 (punkt 4). Den enda skillnaden är ett annat namn på artefakten. Om du gjorde allt rätt och startade programmet kommer du att se något så här:
- Kör skriptet för att skapa rpg-schema i Workbench:
CREATE SCHEMA `rpg` ;
- Valfritt . Om du vill se vilket beteende som förväntas kan du ändra
com.game.service.PlayerService
annoteringsvärdet från "db" till "minne" i klassen i konstruktorparametern . I det här fallet kommer Spring att använda . Efter testet, glöm inte att ändra anteckningsvärdet tillbaka till "db" .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Ordna alla nödvändiga anteckningar i entitetsklassen
com.game.entity.Player
. Tabellen ska heta "spelare", schema "rpg". För enamer, använd@Enumerated(EnumType.ORDINAL)
utöver annoteringen@Column
. Låt mig påminna dig om att längden på namnfältet bör vara upp till 12 tecken, titelfältet - upp till 30 tecken. Absolut alla fält får inte vara null. PlayerRepositoryDB
Lägg till ett privat slutfält i klassenSessionFactory sessionFactory
, initiera detta fält i klasskonstruktorn. Använd egenskaper som i vanliga uppgifter (vi kommer att arbeta med MySQL-databasen version 8). Från intressant - lägg till
Detta gör att du inte kan skapa en tabell manuellt (eller genom att köra ett sql-skript).properties.put(Environment.HBM2DDL_AUTO, "update");
- Implementera alla klassmetoder. För en förändring, låt oss göra så här:
- Implementera metoden
getAll
viaNativeQuery
- Implementera metoden
getAllCount
viaNamedQuery
- I metoden
beforeStop
, anrop ysessionFactory
-metodenclose
. Genom att ha en anteckning på metoden@PreDestroy
kommer Spring att anropa den här metoden innan programmet stoppas, vilket gör att du kan frigöra alla systemresurser på ett giltigt sätt. - Implementeringen av andra metoder är upp till dig. Men glöm inte transaktioner och åtaganden för metoder som på något sätt ändrar innehållet i databasen.
- Starta applikationen. Om du gjorde allt rätt får du en fungerande applikation. Men det finns inga data där, så kör init.sql- skriptet (från resurser) genom Workbench så att de visas. Därefter trycker du på F5 i webbläsaren och kontrollerar att du har implementerat alla metoder korrekt.
- Det skulle vara intressant att se exakt vilka frågor Hibernate kör, så låt oss lägga till frågeloggning. För att göra detta, lägg till p6spy:p6spy:3.9.1 beroendet till pom.xml . Skapa filen spy.properties i resursmappen där du anger:
Och i konstruktören av klassen PlayerRepositoryDB, ändra två alternativ: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 kommer du att se 2 rader i serverutgången för varje begäran. Den första är vilken sats som förbereds, den andra är frågan med de infogade parametrarna.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Det var allt, projektet är klart, grattis!
Faktum är att arbetet med Hibernate från Spring använder ett annat tillvägagångssätt, vilket vi kommer att ta upp i den femte modulen.
Projektanalys.
GO TO FULL VERSION