JavaRush /Java 博客 /Random-ZH /我们添加与数据库相关的所有内容。(第 1 部分)-“Java 项目从头到尾”
Roman Beekeeper
第 35 级

我们添加与数据库相关的所有内容。(第 1 部分)-“Java 项目从头到尾”

已在 Random-ZH 群组中发布
我们正在一步一步地朝着我们的目标前进。 “Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 1 部分今天我们需要解决很多任务:
  1. 添加飞行路线。这里我们将为项目配置数据库的部署。
  2. 添加数据库架构。
  3. 添加存储库层。
  4. 添加机器人统计命令。
  5. 毕竟,编写测试。
所以坐下来,坐下来,将会有一篇很长的文章。我们已经学习了如何使用 docker 和 docker-compose 部署我们的应用程序。这并不容易,祝贺那些成功做到这一点的人。如果您对实现有任何疑问,可以查看此拉取请求中的代码。

添加飞行路线

要添加 Flyway,您需要有一个数据库,我们将其添加为 docker-compose 中的另一个服务。上次我说过 docker-compose 有一个 services 部分,它正是负责添加和管理某个基础设施——即一组应用程序/数据库/消息传递器等。
我已经讨论过Flyway 是什么以及如何将其添加到 SpringBoot 应用程序中。我建议您在阅读本文之前先刷新一下记忆。您还可以阅读该项目的README.md文件,其中有关于Flyway + SpringBoot的文章的演示。
我们要做的第一件事是更新项目中的主分支 (git pull) 并使用我们的任务名称创建一个新分支 - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1)。让我提醒您:我们重命名了分支,以便可以仅按名称对项目中的任务顺序进行排序。这将使您能够快速从一个步骤移动到另一步骤。现在你可以安心工作了。我们需要添加三个依赖项:
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
第一个依赖项负责将 FlyWay 添加到项目中,第二个依赖项添加连接到 MySQL 数据库的功能。第三个是SpringBoot启动器,它启动了在Spring中使用数据库的所有魔力。我们还添加一个 lombok,以免编写 getter 和 setter:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
现在我们需要一个数据库来进行开发。我们现在将它创建为一个单独的 docker-compose 文件和一个单独的 application.properties 文件(直到我想出更好的主意)。在开发中(特别是在 Spring 生态系统中)有一个叫做配置文件的东西。根据配置文件,启动不同的设置进行操作。我认为将来我们会将 docker-compose 合并到一个文件中,并确保只启动一个数据库来根据我们需要的设置进行开发。现在我们将这样做:
  1. 让我们在项目的根目录中创建一个文件 docker-compose-test.yml,其中只有具有自己设置的数据库才会启动。
  2. 让我们创建一个 application-test.properties 文件,其设置与 docker-compose-test.yml 文件中的设置相匹配。
为了使用 MySQL,我从DockerHub获取了官方映像:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 2 部分快速滚动后,我找到了必要的变量: MYSQL_DATABASE - 数据库名称 MYSQL_USER - 数据库用户名 MYSQL_PASSWORD - 数据库用户密码 以及如何正确编写它们:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
之后,我在项目根目录中创建 docker-compose-test.yml:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
要运行此特定文件以与 docker-compose 一起使用,您需要在 request 中使用-f标志。这意味着将提供启动的文件的名称,而不是采用标准的 docker-compose.yml。因此,请求将如下所示: docker-compose -f docker-compose-test.yml up -d 事实证明,首先我们说要采用哪个文件(-f docker-compose-test.yml),然后我们假设我们需要启动服务并以守护进程模式 ( up -d ) 执行此操作 - 也就是说,以便该进程在启动此命令的终端会话之外运行。我们启动并尝试连接到数据库以确保它已启动并且可以使用。为此,打开熟悉的 MySQL Workbench(我们在这里讨论过)并创建一个新连接:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 3 部分我们需要填写以下字段:
  • 连接名称 - 连接名称 - 可选,DEV_JRTB_DB;
  • 主机名 - 这是部署数据库的地址。在我们的例子中,一切都将保持原样:127.0.0.1,或 localhost ;
  • 用户名 - 这里是 root,正如我们在 docker-compose 中所写的那样;
  • 密码 - 也是root。
之后,您需要检查是否存在连接。为此,请单击“测试连接”“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 4 部分结果,我们得到:无法连接到 MySQL...为什么?我们去码头看看docker容器发生了什么。我们在终端中写入:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 5 部分我们看到终端是59分钟前创建的,重启是55秒……为什么?不太清楚,需要看日志。转到终端中的项目根目录并运行以下命令: docker-compose -f docker-compose-test.yml messages
我们得到:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

现在很明显,数据库从未以我们的设置启动。错误是相同的,所以让我们将其从工作表中分离出来:
2021-02-28 11:03:37+00:00 [错误] [入口点]:数据库未初始化且未指定密码选项 dev-jrtb-db | 您需要指定 MYSQL_ROOT_PASSWORD、MYSQL_ALLOW_EMPTY_PASSWORD 和 MYSQL_RANDOM_ROOT_PASSWORD 之一
也就是说,他需要确定root用户——主用户的密码。好的,现在我们将更新我们的文件:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
我们删除了用户和密码的这些变量,只添加了 root 用户的密码。这意味着 root 用户现在将拥有 root 密码。至少我们是这么认为的。现在让我们运行它,看看会发生什么: docker-compose -f docker-compose-test.yml up -d 立即查看日志告诉我们的内容: docker-compose -f docker-compose-test.yml logs
我们看看吧:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

好像已经没有错误了,可以看看是否可以访问。但是,不幸的是,再次无法访问......什么也没有:我们会进一步解决这个问题!“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 6 部分要终止 docker-compose 并删除所有容器,需要编写: docker-compose -f docker-compose-test.yml down 这里我们指定了要删除的文件。该怎么办?让我们谷歌一下:也许有人做得更好。最简单的查询:“docker-compose 中的 mysql 示例”可以帮助我们找到中等资源的链接。他们举了这个例子:
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
我们根据我们的需求进行调整并得到:
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
我们使用我们已知的命令启动此选项: docker-compose -f docker-compose-test.yml up -d 我们再次尝试通过 MySQLWorkBench 访问数据库:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 7 部分最后,出现了访问。但现在我想知道是什么影响了这一点。我在这部分犯了罪:
expose:
   # Opens port 3306 on the container
   - '3306'
这很容易检查:没有这个,什么都不能工作:D。我们来检查一下:删除这部分,重启docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up 我们尝试通过workbench进入数据库:一切正常。那么唯一的选择就是数据库版本。上面明确写着5.7,就是你改成最新的话,应该不行。我重新启动了它 - 它真的不起作用......“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 8 部分显然,他们在最新版本的 docker 镜像上有一些问题。好的没问题。这种情况经常发生在自由软件中。我们将使用 5.7 版本。让我们看看是否有我们需要的数据库 - dev_jrtb_db。为此,请在 MySQL Workbench 中运行 Query 命令SHOW DATABASES“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 9 部分是的,它出现在输出中。太好了,我们可以继续前进。接下来,让我们添加第一个迁移。根据“项目规划:测量两次,切割一次”一文中的任务,我们将创建第一个表 tg_user。所有迁移都将位于projectDir/src/main/resources/db/migration文件夹中,名称为:V00001__add_tg_user_table.sql。为什么那个文件夹里有这么一个名字——我在关于Spring + Flyway的文章中描述过。这就是我们的第一次迁移的样子: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
也就是说,这里我们只是创建一个只有聊天 ID(可用作表中 ID 的唯一元素)及其状态(活动或非活动)的用户的表。因此,如果机器人被停止,订阅信息将保留,并且如果他们想再次使用机器人则可以使用。目前不需要有关用户的其他信息。现在主要问题:如何检查?我们需要启动我们的应用程序。到目前为止,主要的 docker-compose.yml 文件与数据库没有任何联系,我们还需要学习如何与数据库一起调试应用程序。因此,让我们使用 Intellij IDEA 启动该应用程序。为了测试这一点,我们需要在 JavarushTelegramBotApplication 中运行 main 方法。为了分开部署和测试工作,我们将使用另一个具有属性的文件 - application-test.properties。通过这个模板,我们让 Spring 知道这个文件将用于测试配置文件。当我们不指定配置文件时,将使用默认配置文件(运行 SpringBoot 时在日志中检查这一点:它将在第一行中写入此信息)。它将如下所示:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
application.properties看起来会略有不同:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
显着的区别在于spring.datasource.url 字段:在测试配置文件中,我们在localhost上有一个 URL 。也就是说,应用程序预计在 Docker 之外运行,这是事实,因为在调试时我们将在 Intellij IDEA 中运行我们的项目,并期望我们能够从本地计算机访问数据库。但在 application.properties URL 中,已经指定了另一个 - jrtb-db。这将是 docker-compose 中数据库的名称,这样我们的 docker 应用程序就能够访问该数据库。为什么?因此,它们将在同一个 docker-compose 中启动,并以这种方式相互了解。这是必要的,以便我们为该项目拥有一个封闭的基础设施。但如何在启动时启动配置文件呢?为此,您可以在 Intellij IDEA 中配置 main 方法的启动。为此,可以编辑配置:转到 JavarushTelegramBotApplication 的主类,单击方法声明旁边的绿色箭头,然后选择修改运行配置“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 10 部分输入必要的变量并配置配置文件。在Intellij IDEA中,这个配置窗口的界面略有变化,所以我建议大家将IDEA更新到最新版本,以便我们看到相同的图片:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 11 部分环境变量字段中,我们需要使用添加机器人名称和令牌变量以下模板:variable_name1=value1;variable_name2=value2。即key=value之间用分号分隔。在我们的例子中,它将是这样的: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot(您将为机器人使用不同的名称和令牌) 接下来,在“修改选项”按钮中选择“添加 VM 选项”字段:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 12 部分写入:-Dspring.profiles.active =test - 这将告诉 SpringBoot 使用测试配置文件,这意味着属性将从 application-test.properties 中获取。结果,它看起来像这样:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 13 部分现在我们启动我们的测试数据库: docker-compose -f docker-compose-test.yml up 正是这样,没有 -d 前缀,以便可以立即在中看到日志终端(如果需要)。最后一步是简单地运行 main 方法。如果您按照我所描述的方式执行所有操作,您最终将得到:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 14 部分日志的第二行将描述测试配置文件已获得的内容。我们通过 MySQLWorkbench 并运行两个命令来检查迁移是否已推出并且一切正常(尽管这可以从应用程序启动日志中看到,但绝对值得检查):
  1. 使用dev_jrtb_db;
  2. 显示表格;
结果:“Java 项目从头到尾”:添加与数据库相关的所有内容。 第 1 - 15 部分正如我们所料,我们得到了两张桌子。第一个是用于统计迁移的技术,第二个是我们的 Telegram 用户表。全部:添加了 Flyway 和数据库。现在,新的迁移将会顺利进行。最困难的事情是该过程的首次设置和启动。 接下来,我们正在完成这项全局任务的工作:向 docker-compose.yml 添加数据库、添加存储库层、机器人统计数据、编写和更新测试和文档。

该系列所有材料的列表位于本文开头。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION