還記得前端第三個模塊的項目嗎,它需要為服務器 API 實現一個 rpg 管理面板?如果有人記得,地圖被用作服務器上的存儲。自然,在現實生活中,不會使用這樣的存儲,而是使用數據庫。這個項目的目標是使用 Hibernate 編寫一個替代的存儲庫層實現。
為此你需要:
- 從存儲庫中分叉
- 將您的項目版本下載到您的計算機。
- 在 pom.xml 中添加依賴:
- mysql:mysql-connector-java:8.0.30
- org.hibernate:hibernate-core-jakarta:5.6.11.Final
- 進行 Maven 構建(mvn 全新安裝)。為了進行更改,我們使用 Java 1.8 版。
- 通過 Idea 添加啟動配置。此項的實現可以在講座https://codegym.cc/quests/lectures/cgu.module3.lecture02(第4項)中找到。唯一的區別是工件的名稱不同。如果一切正常並啟動應用程序,您將看到如下內容:
- 在 Workbench 中運行 rpg 模式創建腳本:
CREATE SCHEMA `rpg` ;
- 可選。如果您想查看預期的行為,可以在構造函數參數的類中將
com.game.service.PlayerService
註釋值從“db”@Qualifier
更改為“memory”。在這種情況下,Spring 將使用. 測試後,不要忘記將註釋值改回"db"。IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- 在實體類中安排所有必要的註解
com.game.entity.Player
。該表應命名為“player”,模式為“rpg”。@Enumerated(EnumType.ORDINAL)
對於 enams,除了註釋之外還使用@Column
。讓我提醒您,名稱字段的長度最多應為 12 個字符,標題字段最多應為 30 個字符。絕對所有字段都不能為空。 - 在類中
PlayerRepositoryDB
添加一個private final字段SessionFactory sessionFactory
,在類構造函數中初始化這個字段。像在正常任務中一樣使用屬性(我們將使用 MySQL 數據庫版本 8)。從有趣-添加
這將允許您不手動創建表(或通過執行 sql 腳本)。properties.put(Environment.HBM2DDL_AUTO, "update");
- 實現所有類方法。為了改變,讓我們這樣做:
- 實現方法
getAll
通過NativeQuery
- 實現方法
getAllCount
通過NamedQuery
- 在方法中
beforeStop
,調用 ysessionFactory
方法close
。通過對該方法進行註解@PreDestroy
,Spring 將在停止應用程序之前調用該方法,這將允許您有效地釋放所有系統資源。 - 其他方法的實現由您決定。但是不要忘記以某種方式更改數據庫內容的方法的事務和提交。
- 啟動應用程序。如果您做的一切都正確,您將獲得一個可以工作的應用程序。但是那裡沒有數據,所以通過 Workbench運行init.sql腳本(來自資源)以便它們出現。之後,在瀏覽器中按 F5 並檢查您是否已正確實現所有方法。
- 確切地了解 Hibernate 執行了哪些查詢會很有趣,所以讓我們添加查詢日誌記錄。為此,將p6spy:p6spy:3.9.1依賴項添加到 pom.xml 。在資源文件夾中,創建一個文件spy.properties,其中指定:
在 PlayerRepositoryDB 類的構造函數中,更改兩個選項: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
現在,在每個請求的服務器輸出中,您將看到 2 行。第一個是準備什麼語句,第二個是帶有插入參數的查詢。properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
就這樣,項目準備好了,恭喜!
事實上,從 Spring 使用 Hibernate 使用不同的方法,我們將在第五個模塊中介紹。
項目分析。
GO TO FULL VERSION