Husker du prosjektet fra den tredje modulen på frontend, der det var nødvendig å implementere et rpg-adminpanel for server-API? Hvis noen husker, ble et kart brukt som lagring på serveren. Naturligvis, i det virkelige liv, brukes ikke slike lagringer, men databaser brukes. Målet med dette prosjektet vil være å skrive en alternativ depotlagimplementering ved hjelp av Hibernate.
Til dette trenger du:
- Gaffel fra et depot
- Last ned din versjon av prosjektet til datamaskinen din.
- Legg til avhengigheter til pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Lag en maven build (mvn clean install). For en endring bruker vi Java versjon 1.8.
- Legg til lanseringskonfigurasjon via Idea. Implementeringen av dette elementet finner du i forelesningen https://codegym.cc/quests/lectures/cgu.module3.lecture02 (punkt 4). Den eneste forskjellen er et annet navn på artefakten. Hvis du gjorde alt riktig og startet applikasjonen, vil du se noe slikt:
- Kjør skriptet for opprettelse av rpg-skjema i Workbench:
CREATE SCHEMA `rpg` ;
- Valgfritt . Hvis du vil se hvilken oppførsel som forventes, kan du endre
com.game.service.PlayerService
merknadsverdien fra "db" til "minne" i klassen i konstruktørparameteren . I dette tilfellet vil Spring bruke . Etter testen, ikke glem å endre merknadsverdien tilbake til "db" .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Ordne alle nødvendige merknader i enhetsklassen
com.game.entity.Player
. Tabellen skal hete "spiller", skjema "rpg". For enamer, bruk@Enumerated(EnumType.ORDINAL)
i tillegg til merknaden@Column
. La meg minne deg på at lengden på navnefeltet skal være opptil 12 tegn, tittelfeltet - opptil 30 tegn. Absolutt alle felt må ikke være null. PlayerRepositoryDB
Legg til et privat siste felt i klassenSessionFactory sessionFactory
, initialiser dette feltet i klassekonstruktøren. Bruk egenskaper som i vanlige oppgaver (vi vil jobbe med MySQL-databasen versjon 8). Fra interessant - legg til
Dette vil tillate deg å ikke lage en tabell manuelt (eller gjennom utførelse av et sql-skript).properties.put(Environment.HBM2DDL_AUTO, "update");
- Implementer alle klassemetoder. For en forandring, la oss gjøre dette:
- Implementer metoden
getAll
viaNativeQuery
- Implementer metoden
getAllCount
viaNamedQuery
- I metoden
beforeStop
kaller du ysessionFactory
-metodenclose
. Ved å ha en merknad på metoden@PreDestroy
vil Spring kalle denne metoden før den stopper applikasjonen, og dette vil tillate deg å frigi alle systemressurser gyldig. - Implementeringen av andre metoder er opp til deg. Men ikke glem transaksjoner og forpliktelser for metoder som på en eller annen måte endrer innholdet i databasen.
- Start applikasjonen. Hvis du gjorde alt riktig, vil du få en fungerende søknad. Men det er ingen data der, så kjør init.sql- skriptet (fra ressurser) gjennom Workbench slik at de vises. Trykk deretter F5 i nettleseren og kontroller at du har implementert alle metodene riktig.
- Det ville vært interessant å se nøyaktig hvilke spørringer Hibernate utfører, så la oss legge til spørringslogging. For å gjøre dette, legg til p6spy:p6spy:3.9.1- avhengigheten til pom.xml . I ressursmappen oppretter du en fil spy.properties , der spesifiserer:
Og i konstruktøren til PlayerRepositoryDB-klassen, endre to alternativer: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
Nå i serverutgangen for hver forespørsel vil du se 2 linjer. Den første er hvilken setning som er utarbeidet, den andre er spørringen med de innsatte parameterne.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Det er alt, prosjektet er klart, gratulerer!
Arbeid med Hibernate fra Spring bruker faktisk en annen tilnærming, som vi vil dekke i den femte modulen.
Prosjektanalyse.
GO TO FULL VERSION