JavaRush /Java Blog /Random-TW /我們新增與資料庫相關的所有內容。(第 1 部分)-“Java 專案從頭到尾”
Roman Beekeeper
等級 35

我們新增與資料庫相關的所有內容。(第 1 部分)-“Java 專案從頭到尾”

在 Random-TW 群組發布
我們正在一步一步地朝著我們的目標前進。 「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