JavaRush /Java 博客 /Random-ZH /SpringBoot + Flyway - 《Java 项目从 A 到 Z》
Roman Beekeeper
第 35 级

SpringBoot + Flyway - 《Java 项目从 A 到 Z》

已在 Random-ZH 群组中发布
有关创建 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