JavaRush /Java Blog /Random-TW /SpringBoot + Flyway - 《Java 專案從 A 到 Z》
Roman Beekeeper
等級 35

SpringBoot + Flyway - 《Java 專案從 A 到 Z》

在 Random-TW 群組發布
有關建立 Java 專案的系列文章中的一篇文章(其他資料的連結位於最後)。其目標是分析關鍵技術,結果是編寫一個電報機器人。在這一部分中,我們嘗試啟動SpringBoot和Flyway。 最少的理論量,隨你喜歡)))我們無限期地省略了 Flyway/Liquibase 的最終比較,然後進入正題。即便如此,它已經拖延了。為了不重複描述 Flyway,我決定立即將其添加到我們未來的 JRTB 專案中。《Java 專案從頭到尾》:SpringBoot + Flyway - 1

作為其中的一部分,我們需要做什麼?

  1. 啟動基於 Maven 的 SpringBoot 應用程式。
  2. 在那裡添加 Flyway:幸運的是,它們很容易整合。
  3. 為範例資料庫中的表格新增架構。
這樣我們將學習如何使用 Flyway。為什麼要建立一個單獨的項目,而不是立即納入​​我們的 JRTB?因為稍後,任何想要了解如何執行此操作的人都會有一個帶有範例的項目和一篇描述如何使用它的文章。好吧,我們走吧!

什麼是飛行路線

要使用某個東西,您首先需要弄清楚它是什麼以及為什麼。 Flyway是一個資料庫版本控制工具。話雖耳熟能詳,但不知何故還沒有加上理解,對吧?讓我們試著描述一下 Flyway 解決的問題。假設我們有一個項目。就像我們世界上的一切一樣,它並不完美,因此不可能規劃和製定該專案的最終版本。每次都會出現某些未解釋的細微差別。該項目在其工作中使用資料庫。當然,如果專案發生變化,資料庫結構也可能發生變化。假設我們為專案中的一個實體新增一個欄位。怎麼做?
  1. 將此欄位新增至我們的實體中,更新所有內容以使業務邏輯正常運作。
  2. 更新資料庫。唯一可能的方法是手動完成。為此,您需要進去註冊必要的sql腳本。
第二點提出了很多問題:
  1. 但是,如果我們有多個地方部署項目,那麼是否需要在每個地方都進行此操作?
  2. 如果我們想回去,我們如何準確地知道資料庫結構現在處於什麼狀態?
  3. 我們如何確保資料庫更改成功?
  4. 我怎樣才能有機會追蹤專案中發生的所有資料庫變更?
如果您手動執行,答案將不是最好的...為了避免所有這些困難,您可以使用資料庫遷移工具。其中之一就是Flyway。他的工作是什麼?作為專案的一部分,我們儲存單獨的 sql 檔案(所謂的遷移),這些檔案一次儲存我們對資料庫所做的所有操作。所有遷移都嚴格按照一定的順序進行,這使您可以追蹤資料庫的結構和資料的變化(通常,使用遷移,測試資料被添加到專案中,以便當它部署到某個伺服器時,它已經有一些您可以用來測試項目的值)。測試通過後,在建置專案時啟動遷移。他們連接到資料庫並執行遷移。如果已經在此資料庫上進行了遷移,那麼Flyway 將簡單地跳過它們(它將有關遷移的資料及其狀態儲存在資料庫中的單獨表中,這有助於管理它們),如果某些遷移不成功,則該專案建置及其到伺服器的安裝(部署)將停止。我試圖盡可能詳細地描述它。如果一切仍然不完全清楚,也沒關係:透過練習,理解就會到來。

啟動 SpringBoot + Flyway

什麼是 Spring Boot

我們要推出什麼?...要了解我們在做什麼以及為什麼要做,您需要確定 SpringBoot 是什麼。首先,讓我們快速(好吧,非常快地)談談Spring。目前,它是用 Java 開發伺服器應用程式的事實上的行業標準。標準是什麼?我該如何向你解釋這一點?Spring 是應用程式的骨架,然後我們將「內容」(我們的業務邏輯)放到它上面。借助Spring(下文我將使用這張描圖紙,以免浪費時間切換語言:D))Spring為我們提供了一個開始,我們從這裡開始做所有的事情。它是多方面的、多模組的:
  1. 您想使用資料庫嗎?你想要關係嗎?你想要非關係型嗎?我們在這裡使用 Spring Data。
  2. 您想使用 http 請求嗎?給你,Spring Web(Spring MVC)。
  3. 您是否需要一個容器將所有物品放在一個地方?這就是 Spring 核心。
  4. 您是否需要在專案上設定安全性以便有不同的角色和命令鏈?春季安全。
  5. 正當你以為擁有這樣的東西該有多好時,事實證明 Spring 已經具備了你所需要的東西,而且它集成起來又快又容易。
因此,我們可以說,這不僅僅是一個框架(如此龐大的庫),而是一個正在快速發展的整個生態系統。要了解 Spring Core 是什麼,即連接模組的基礎,我建議您觀看有關創建自己的框架的現場演示。它由 Evgeny Borisov 主持,他是 Java 和 Spring 領域非常酷的人。做他所做的一切,你會更清楚春天的工作。反過來,SpringBoot 是他們所擁有的一切的頂峰。純淨水的魔力。首次啟動應用程式的最低設定。當然,這不會讓您了解如何使用它以及做什麼。但在衝入開發深處之前,你需要鳥瞰一切。

啟動 SpringBoot

既然我們已經了解了 Maven 是什麼,那麼讓我們根據需要建立一個新專案。為此,您只需訪問專門為此創建的網站即可。它稱為Spring Initializr《Java 專案從頭到尾》:SpringBoot + Flyway - 2在這裡您需要填寫並選擇您需要的內容:
  1. 專案建置工具是gradle或maven。正如您所看到的,Ant 甚至不再被提及。這是關於哪些建置工具值得您花時間的一個很好的提示。
  2. 你可以使用的語言是java、kotlin、groovy。這裡一切都很簡單:它們都是類似 JVM 且易於運行的 Java 程式碼。順便說一下,Kotlin 值得一看。坦白說,Groovy 已經變得無趣了(曾經有一段時間他們轉向groovy,但很快就過去了)。
  3. Spring版本...這裡要了解Spring主體部分及其模組的版本是一致的。
  4. 項目數據。我已經描述過這些事情。
  5. 我們選擇要收集的檔案 - Jar 或 War。
  6. 嗯,我們最喜歡的 Java 版本。最近出現了很多這樣的版本……他們等了很多年,現在一年有兩個。
在我們的例子中,我們將在JavaRush 社群組織中發布該項目,因此有關該項目的資訊將是適當的:
  1. Maven - 我們之前與您討論過這一點並非毫無意義。
  2. Java 是我們的寵兒 :D
  3. 我們以 2.2.11 版本為例。為什麼不是最新的呢?因為越新,出現 bug 的可能性就越大。對我們來說,哪個版本並不重要,但舊版本會更可靠。因此,我們選擇2.2.11。
  4. 群組:com.github.javarushcommunity
  5. 神器:springboot-flyway-demo
  6. 名稱:SpringBoot + Flyway 演示
  7. 描述:專案示範了 SpringBoot 和 Flyway 之間的整合。(是的,編寫文件的能力是開發的重要組成部分:))
  8. 套件名稱:com.github.javarushcommunity.springbootflywaydemo。在這裡,他們將立即為我們創建一個基本包,其中包含一個將啟動我們的應用程式的類別。
  9. 包裝:罐裝
  10. Java:8。我們不要走在機車前面,走好老八。為什麼不是11?做什麼的?對於我們的例子,我不明白這一點。
《Java 專案從頭到尾》:SpringBoot + Flyway - 3現在讓我們來新增模組。我們需要找到與 Flyway 的整合。您也可以新增與 MySQL 和 Spring Data 相關的內容。讓我們添加另一個 lombok(這是非常必要的事情,現在請相信我:D))為此,請單擊“ ADD DEPENDENCIES ...”並選擇您需要的所有內容:《Java 專案從頭到尾》:SpringBoot + Flyway - 4這就是我們添加Flyway 的方式。《Java 專案從頭到尾》:SpringBoot + Flyway - 5龍目島...等等。結果,我們得到:《Java 專案從頭到尾》:SpringBoot + Flyway - 6嗯...我們填寫了所有內容))現在單擊生成...就這樣 - 包含生成項目的存檔已準備就緒:)還有一個很酷的東西,如共享...,這將為您提供指向您剛剛填寫的頁面的連結。也就是說,這是我生成的。即使出現問題,您也可以隨時使用連結進行檢查。接下來,我們需要將建立的專案連結到Git儲存庫,因此我們複製建立的springboot-flyway-demo專案並透過IDEA下載它。為此,您需要開啟 idea 並選擇File -> New -> Project from Existing Sources...《Java 專案從頭到尾》:SpringBoot + Flyway - 7現在新增 URL 並點擊Clone。下一步是將生成的項目的內部結構轉移到我們克隆的項目。使困惑?我現在就給你看。我將其解壓縮並收到以下一組檔案:《Java 專案從頭到尾》:SpringBoot + Flyway - 8這些檔案需要傳輸到克隆的專案中。與上一篇文章一樣,讓我們將 pom.xml 新增為 Maven 專案:《Java 專案從頭到尾》:SpringBoot + Flyway - 9現在我們有興趣查看為我們產生的內容。如果您開啟 src 及更多資料夾中的所有資料夾,您將看到 Maven 專案中常見的層次結構,我們在上一篇文章中對此進行了討論。還沒讀過的人,請讀!《Java 專案從頭到尾》:SpringBoot + Flyway - 10可以看到我們有一個Application類,我們的SpringBoot應用程式將使用它來啟動。感謝 SpringBoot 的 Maven 插件,我們現在有了 Maven 所需的任務,即 spring-boot:run。我們在哪裡可以找到這些資訊?右邊,打開 Maven 板和我們的專案:《Java 專案從頭到尾》:SpringBoot + Flyway - 11將會出現錯誤,我們將無法讀取它,我們將看到類似這樣的內容:《Java 專案從頭到尾》:SpringBoot + Flyway - 12要獲取更多信息,為了速度,我們可以運行 main 方法Application 類:《Java 專案從頭到尾》:SpringBoot + Flyway - 13然後我們將看到真正的原因:《Java 專案從頭到尾》:SpringBoot + Flyway - 14這裡已經有更多信息,您可以用它做一些事情。怎麼了?我們有與資料庫關聯的依賴項,因此我們需要提供連接到資料庫的設定。為此,我們google了一下,發現需要在application.properties中加入以下設定:
spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
我們再次運行 main 方法並得到:《Java 專案從頭到尾》:SpringBoot + Flyway - 15現在我們需要添加至少一個遷移。要正確編寫遷移,您需要採用以下模板:V<VERSION>__<NAME>.sql使用此模板,我們將在對應的資料夾中 建立名為V00001__Create_country_table.sql 的遷移檔案: /src/main/resources/資料庫.遷移/ . 讓我們在其中建立一個國家/地區表。讓我們採用第二篇有關資料庫的文章中的腳本。《Java 專案從頭到尾》:SpringBoot + Flyway - 16在開始之前,我們先進去建立一個工作資料庫:flyway_demo_db。讓我們透過 MysqlWorkbench 來完成此操作:《Java 專案從頭到尾》:SpringBoot + Flyway - 17現在我們可以再次執行 main 方法:《Java 專案從頭到尾》:SpringBoot + Flyway - 18一切正常,但由於專案中還沒有任何內容,因此它完成了工作。然而,從日誌中可以清楚看出(閱讀日誌是什麼):
  1. 成功連接資料庫。
  2. 遷移已經過驗證,一切正常。
  3. Flyway 建立了一個表格來管理遷移。
  4. 00001 號移民開始了-國家的創建成功了。
要檢查這一點,您可以查看資料庫中正在執行的操作。因此,讓我們轉到 MySQL 伺服器,看看 Flyway_demo_db 資料庫中的表格發生了什麼情況: $ USE Flyway_demo_db; $顯示表格;《Java 專案從頭到尾》:SpringBoot + Flyway - 19正如我所預料的,發生了遷移,在此期間創建了國家/地區表並出現了flyway_schema_history表,該表存儲有關遷移的信息。讓我們進一步看看有哪些記錄(以及是否有記錄)。 $SELECT * FROM Flyway_schema_history;《Java 專案從頭到尾》:SpringBoot + Flyway - 20這是錄音,唯一的錄音。它包含很多有趣的數據。版本、遷移的描述、什麼類型的 SQL(也可能是 XML)、腳本本身的名稱、校驗和(這類似於哈希碼,用於檢查遷移是否已更改。這樣就完成瞭如果我們在資料庫中進行了遷移,然後進行了更正:這是無法完成的,所有更改都只能透過新的遷移進行,並且為了防止這種情況發生,檢查量會監視此情況)、用戶 sql 名稱、遷移處理日期、執行時間和結果(成功或不成功)。一次編寫的遷移將來不應更改。即使它有缺陷。所有變更只能透過新的遷移進行。這是非常重要的。為了展示將會發生什麼,讓我們稍微更改腳本並嘗試再次運行它。讓我們在遷移中的國家/地區表中添加一個條目:《Java 專案從頭到尾》:SpringBoot + Flyway - 21並運行 main 方法,這就是我們得到的結果:《Java 專案從頭到尾》:SpringBoot + Flyway - 22正如我所料,flyway 識別出腳本已更改,並且沒有執行遷移。在某些情況下,實際上可能需要執行更新的遷移,為了讓 Flyway 跳過此操作,您需要刪除 Flyway_schema_history 表中的項目,然後執行更新的遷移。這不是正常行為,也不應該如此,但您也需要了解這種解決問題的方法。我們處理了第一次遷移。現在我想新增另一個遷移,其中包含有關國家/地區的數據,如有關資料庫的文章所示:檔案V00002__Add_test_data_to_country.sql《Java 專案從頭到尾》:SpringBoot + Flyway - 23讓我們再次運行 main 方法:《Java 專案從頭到尾》:SpringBoot + Flyway - 24從日誌中可以清楚地看出,在遷移開始之前,資料庫是在版本 00001 中,因此該版本之後的所有遷移。接下來,00002版本推出並獲得成功。讓我們檢查一下,或者您是否已經相信我國家/地區的三筆記錄已經在資料庫中?))我會檢查,所以證明:《Java 專案從頭到尾》:SpringBoot + Flyway - 25像這樣的東西。如果您再次執行該項目,flyway 將簡單地跳過滾動遷移,因為資料庫完全符合所需的版本。

結論

這次我們學習如何結合SpringBoot來理解和使用資料庫遷移工具。這些資訊對於理解什麼是資料庫版本控制工具是必要的,以 Flyway 為例。朋友們,我展示的專案原始碼發佈在我們組織的 Github 上。如果您喜歡這個範例,請給它一顆星,我就會明白我的工作很有用並且確實值得繼續。傳統上,我建議訂閱我的 Github 帳戶。透過他,我進行了所有關於開源的工作以及我的文章中總是附帶的所有演示專案。感謝大家的閱讀。下次我們將編寫我們的應用程式。未來將會有一些關於 Docker 的必要理論,但我們將用實踐來大量稀釋它。

有用的連結

今天沒有太多有用的連結。關注Evgeniy的視頻,真的很值得!
  1. 用於在 Spring 上建立專案的網站
  2. Evgeniy Borisov — Spring 建造者
  3. Spring 中的 Flyway 文檔

此系列所有資料的清單位於本文開頭。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION