Tandaan ang proyekto mula sa ikatlong module sa frontend, kung saan kinakailangan na ipatupad ang isang rpg admin panel para sa server API? Kung may nakakaalala, isang mapa ang ginamit bilang imbakan sa server. Naturally, sa totoong buhay, ang mga naturang storage ay hindi ginagamit, ngunit ang mga database ay ginagamit. Ang layunin ng proyektong ito ay magsulat ng alternatibong pagpapatupad ng layer ng repositoryo gamit ang Hibernate.
Para dito kailangan mo:
- Fork mula sa isang repositoryo
- I-download ang iyong bersyon ng proyekto sa iyong computer.
- Magdagdag ng mga dependency sa pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Gumawa ng maven build (mvn clean install). Para sa isang pagbabago, ginagamit namin ang bersyon ng Java 1.8.
- Magdagdag ng configuration ng paglunsad sa pamamagitan ng Idea. Ang pagpapatupad ng item na ito ay matatagpuan sa lecture https://codegym.cc/quests/lectures/cgu.module3.lecture02 (item 4). Ang pagkakaiba lang ay ibang pangalan para sa artifact. Kung ginawa mo ang lahat ng tama at inilunsad ang application, makakakita ka ng ganito:
- Patakbuhin ang script ng paglikha ng rpg schema sa Workbench:
CREATE SCHEMA `rpg` ;
- Opsyonal . Kung gusto mong makita kung anong pag-uugali ang inaasahan, maaari mong baguhin
com.game.service.PlayerService
ang halaga ng anotasyon mula sa "db" patungo sa "memorya" sa klase sa parameter ng constructor . Sa kasong ito, gagamitin ng Spring ang . Pagkatapos ng pagsubok, huwag kalimutang palitan ang halaga ng anotasyon pabalik sa "db" .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Ayusin ang lahat ng kinakailangang anotasyon sa klase ng entity
com.game.entity.Player
. Ang talahanayan ay dapat na pinangalanang "manlalaro", schema "rpg". Para sa mga enam, gamitin@Enumerated(EnumType.ORDINAL)
bilang karagdagan sa anotasyon@Column
. Ipaalala ko sa iyo na ang haba ng field ng pangalan ay dapat hanggang sa 12 character, ang field ng pamagat - hanggang 30 character. Ganap na lahat ng mga patlang ay hindi dapat null. PlayerRepositoryDB
Magdagdag ng pribadong final field sa classSessionFactory sessionFactory
, simulan ang field na ito sa class constructor. Gumamit ng mga pag-aari tulad ng sa mga normal na gawain (magtatrabaho kami sa bersyon 8 ng MySQL database). Mula sa kawili-wili - idagdag
Ito ay magbibigay-daan sa iyo na huwag lumikha ng isang talahanayan nang manu-mano (o sa pamamagitan ng pagpapatupad ng isang sql script).properties.put(Environment.HBM2DDL_AUTO, "update");
- Ipatupad ang lahat ng mga pamamaraan ng klase. Para sa pagbabago, gawin natin ito:
- Ipatupad ang pamamaraan
getAll
sa pamamagitan ngNativeQuery
- Ipatupad ang pamamaraan
getAllCount
sa pamamagitan ngNamedQuery
- Sa pamamaraan
beforeStop
, tawagan angsessionFactory
paraan ng yclose
. Sa pamamagitan ng pagkakaroon ng anotasyon sa pamamaraan@PreDestroy
, tatawagin ng Spring ang paraang ito bago ihinto ang application, at magbibigay-daan ito sa iyong wastong ilabas ang lahat ng mapagkukunan ng system. - Ang pagpapatupad ng iba pang mga pamamaraan ay nasa iyo. Ngunit huwag kalimutan ang tungkol sa mga transaksyon at commit para sa mga pamamaraan na kahit papaano ay nagbabago sa mga nilalaman ng database.
- Ilunsad ang application. Kung ginawa mo ang lahat ng tama, makakakuha ka ng isang gumaganang aplikasyon. Ngunit walang data doon, kaya patakbuhin ang init.sql script (mula sa mga mapagkukunan) sa pamamagitan ng Workbench upang lumitaw ang mga ito. Pagkatapos nito, pindutin ang F5 sa browser at suriin kung naipatupad mo nang tama ang lahat ng mga pamamaraan.
- Magiging kawili-wiling makita kung ano mismo ang mga query na isinasagawa ng Hibernate, kaya magdagdag tayo ng query logging. Upang gawin ito, idagdag ang p6spy:p6spy:3.9.1 dependency sa pom.xml . Sa folder ng mga mapagkukunan, lumikha ng isang file spy.properties , kung saan tinukoy ang:
At sa constructor ng klase ng PlayerRepositoryDB, baguhin ang dalawang opsyon: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
Ngayon sa output ng server para sa bawat kahilingan makakakita ka ng 2 linya. Ang una ay kung anong pahayag ang inihanda, ang pangalawa ay ang query na may nakapasok na mga parameter.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Iyon lang, handa na ang proyekto, congratulations!
Sa katunayan, ang pagtatrabaho sa Hibernate mula sa Spring ay gumagamit ng ibang diskarte, na tatalakayin natin sa ikalimang module.
Pagsusuri ng proyekto.
GO TO FULL VERSION