JavaRush /Blog Java /Random-MS /Kami menambah semua yang berkaitan dengan pangkalan data....

Kami menambah semua yang berkaitan dengan pangkalan data. (Bahagian 1) - "Projek Java dari A hingga Z"

Diterbitkan dalam kumpulan
Langkah demi langkah kita bergerak ke arah matlamat kita. "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 1Hari ini kita perlu menyelesaikan banyak tugas:
  1. Tambah Flyway. Di sini kami akan mengkonfigurasi penggunaan pangkalan data untuk projek itu.
  2. Tambah skema pangkalan data.
  3. Tambah lapisan repositori.
  4. Tambah arahan untuk statistik bot.
  5. Tulis ujian, selepas semua.
Jadi duduk, duduk, akan ada bacaan yang panjang. Kami telah pun mempelajari cara untuk menggunakan aplikasi kami menggunakan docker dan docker-compose. Ia tidak mudah, dan tahniah kepada mereka yang berjaya melakukannya. Jika anda mempunyai sebarang soalan tentang pelaksanaan, anda boleh melihat kod dalam permintaan tarik ini .

Menambah Flyway

Untuk menambah Flyway, anda perlu mempunyai pangkalan data, yang akan kami tambahkan sebagai perkhidmatan lain dalam docker-compose. Kali terakhir saya mengatakan bahawa docker-compose mempunyai bahagian perkhidmatan, yang bertanggungjawab untuk menambah dan mengurus infrastruktur tertentu - iaitu, satu set aplikasi/pangkalan data/messenger, dsb.
Saya telah pun bercakap tentang apa itu Flyway dan cara menambahkannya pada aplikasi SpringBoot . Saya menasihati anda untuk menyegarkan ingatan anda sebelum membaca artikel ini. Anda juga boleh membaca fail README.md projek dengan demonstrasi artikel tentang Flyway + SpringBoot.
Perkara pertama yang kami lakukan ialah mengemas kini cawangan utama kami dalam projek (git pull) dan buat yang baharu dengan nama tugas kami - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Biar saya ingatkan anda: kami menamakan semula cawangan supaya mungkin untuk mengisih urutan tugas dalam projek hanya mengikut nama. Ini akan membolehkan anda bergerak dengan cepat dari satu langkah ke langkah yang lain. Sekarang anda boleh bekerja dengan tenang. Kita perlu menambah tiga kebergantungan:
<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>
Kebergantungan pertama bertanggungjawab untuk menambah FlyWay ke projek, yang kedua menambah keupayaan untuk menyambung ke pangkalan data MySQL. Yang ketiga ialah SpringBoot starter, yang melancarkan semua keajaiban menggunakan pangkalan data dalam Spring. Dan mari kita tambah lombok supaya tidak menulis getter dan setter:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Sekarang kita memerlukan pangkalan data untuk pembangunan. Kami akan menciptanya buat masa ini ( sehingga saya mendapat idea yang lebih baik ) sebagai fail karang docker yang berasingan dan fail berasingan untuk application.properties. Terdapat perkara sedemikian dalam pembangunan (dan dalam ekosistem Spring khususnya) sebagai profil. Bergantung pada profil, tetapan berbeza dilancarkan untuk operasi. Saya fikir pada masa hadapan kita akan menggabungkan docker-compose ke dalam satu fail dan memastikan bahawa hanya satu pangkalan data dilancarkan untuk pembangunan pada tetapan yang kita perlukan. Buat masa ini kami akan melakukan ini:
  1. Mari buat fail dalam akar projek docker-compose-test.yml, di mana hanya pangkalan data dengan tetapannya sendiri akan dilancarkan.
  2. Mari buat fail application-test.properties dengan tetapan yang sepadan dengan tetapan dalam fail docker-compose-test.yml.
Untuk bekerja dengan MySQL, saya mengambil imej rasmi dari DockerHub : "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 2Selepas menatal dengan cepat, saya mendapati pembolehubah yang diperlukan: MYSQL_DATABASE - nama pangkalan data MYSQL_USER - nama pengguna pangkalan data MYSQL_PASSWORD - kata laluan pengguna pangkalan data Dan bagaimana ia perlu ditulis dengan betul:
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
Selepas itu, saya mencipta docker-compose-test.yml dalam akar projek:
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
Untuk menjalankan fail khusus ini untuk berfungsi dengan docker-compose, anda perlu menggunakan bendera -f dalam request . Ini bermakna nama fail yang dilancarkan akan diberikan, bukannya docker-compose.yml standard yang diambil. Oleh itu, permintaan akan kelihatan seperti ini: docker-compose -f docker-compose-test.yml up -d Ternyata pertama kita sebut fail mana yang hendak diambil ( -f docker-compose-test.yml ), dan kemudian kita katakan bahawa kita perlu meningkatkan perkhidmatan dan melakukan ini dalam mod daemon ( up -d ) - iaitu, supaya proses berjalan di luar sesi terminal di mana arahan ini dilancarkan. Kami melancarkan dan cuba menyambung ke pangkalan data untuk memastikan ia telah siap dan boleh digunakan. Untuk melakukan ini, buka MySQL Workbench yang biasa ( kami bercakap mengenainya di sini ) dan buat sambungan baharu: "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 3Kami perlu mengisi medan berikut:
  • Nama sambungan - nama sambungan - secara pilihan, DEV_JRTB_DB;
  • Nama hos - di sini ialah alamat tempat pangkalan data digunakan. Dalam kes kami, semuanya akan kekal seperti sedia ada: 127.0.0.1 , atau localhost;
  • nama pengguna - di sini akan menjadi akar, seperti yang telah kami tulis dalam docker-compose;
  • kata laluan - juga akar.
Selepas ini, anda perlu menyemak sama ada sambungan akan berfungsi. Untuk melakukan ini, klik Sambungan Ujian : "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 4Akibatnya, kami mendapat: Gagal Menyambung ke MySQL... Mengapa? Kami pergi ke terminal dan melihat apa yang berlaku kepada bekas docker. Mari tulis dalam terminal: "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 5Kami melihat bahawa terminal telah dicipta 59 minit yang lalu, dan mulakan semula adalah 55 saat... mengapa? Ia tidak jelas, anda perlu melihat log. Pergi ke akar projek dalam terminal dan jalankan arahan berikut: docker-compose -f docker-compose-test.yml logs
Kita mendapatkan:

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

Kini jelas bahawa pangkalan data tidak pernah bermula dengan tetapan kami. Ralatnya adalah sama, jadi mari asingkan ia daripada helaian:
2021-02-28 11:03:37+00:00 [ERROR] [Entrypoint]: Pangkalan data tidak dimulakan dan pilihan kata laluan tidak ditentukan dev-jrtb-db | Anda perlu menentukan salah satu daripada MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD dan MYSQL_RANDOM_ROOT_PASSWORD
Iaitu, dia perlu menentukan kata laluan untuk pengguna root - pengguna utama. Okay, sekarang kami akan mengemas kini fail kami:
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
Kami mengalih keluar pembolehubah tersebut untuk pengguna dan kata laluan dan hanya menambah kata laluan untuk pengguna akar. Ini bermakna bahawa pengguna root kini akan mempunyai kata laluan root. Sekurang-kurangnya itulah yang kita anggap. Sekarang mari jalankan dan lihat apa yang berlaku: docker-compose -f docker-compose-test.yml up -d Dan segera lihat apa yang log memberitahu kami: docker-compose -f docker-compose-test.yml log
Mari lihat:

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.

Nampaknya tiada ralat lagi, jadi anda boleh melihat sama ada akan ada akses. Tetapi, malangnya, tiada akses lagi... Tiada apa-apa: kami akan memikirkannya dengan lebih lanjut! "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 6Untuk menamatkan docker-compose dan memadam semua bekas, anda perlu menulis: docker-compose -f docker-compose-test.yml down Di sini kami menetapkan fail yang akan dipadamkan. Apa nak buat? Mari google: mungkin seseorang telah melakukannya dengan lebih baik. Pertanyaan paling mudah: "contoh mysql dalam docker-compose" membantu kami mencari pautan ke sumber sederhana. Mereka memberikan contoh ini:
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:
Kami menyesuaikannya dengan keperluan kami dan mendapat:
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'
Kami melancarkan pilihan ini dengan arahan yang telah kami ketahui: docker-compose -f docker-compose-test.yml up -d Kami cuba sekali lagi untuk mengakses pangkalan data melalui MySQLWorkBench: "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 7Akhirnya, akses telah muncul. Tetapi sekarang saya tertanya-tanya apa yang mempengaruhi ini. Saya berdosa di bahagian ini:
expose:
   # Opens port 3306 on the container
   - '3306'
Ia mudah untuk menyemak: tanpa ini, tiada apa yang boleh berfungsi :D. Mari semak: padam bahagian ini, mulakan semula docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Kami cuba memasukkan pangkalan data melalui meja kerja: semuanya baik-baik saja . Kemudian satu-satunya pilihan ialah versi pangkalan data. Ia dengan jelas menyatakan 5.7, iaitu, jika anda menukarnya kepada yang terkini, ia sepatutnya tidak berfungsi. Saya memulakannya semula - dan ia benar-benar tidak berfungsi... "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 8Nampaknya, mereka mempunyai beberapa masalah dengan imej docker pada versi terkini. Okay, tiada masalah. Ini sering berlaku dengan perisian percuma. Kami akan menggunakan versi 5.7. Mari lihat jika terdapat pangkalan data yang kita perlukan - dev_jrtb_db. Untuk melakukan ini, jalankan perintah Query dalam MySQL Workbench SHOW DATABASES : "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 9Ya, ia terdapat dalam output. Hebat, kita boleh teruskan. Seterusnya, mari tambahkan penghijrahan pertama kita. Berdasarkan tugasan daripada artikel "Perancangan projek: ukur dua kali, potong sekali," kami akan membuat jadual pertama kami tg_user. Semua migrasi akan ditempatkan dalam folder projectDir/src/main/resources/db/migration , dan namanya ialah: V00001__add_tg_user_table.sql . Mengapa terdapat nama sedemikian dalam folder itu - saya menerangkannya dalam artikel tentang Spring + flyway. Beginilah rupa migrasi pertama kami: 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
);
Maksudnya, di sini kita hanya mencipta jadual pengguna yang hanya mempunyai ID sembang (elemen unik yang boleh digunakan untuk berfungsi sebagai ID dalam jadual) dan keadaannya - aktif atau tidak aktif. Jadi, jika bot dihentikan, maklumat langganan akan kekal dan boleh digunakan jika mereka mahu menggunakan bot itu semula. Tiada maklumat lain tentang pengguna diperlukan buat masa ini. Sekarang soalan utama: bagaimana untuk menyemak ini? Kami perlu melancarkan aplikasi kami. Setakat ini, fail docker-compose.yml utama tidak mempunyai sambungan dengan pangkalan data, dan kami juga perlu belajar cara menyahpepijat aplikasi bersama-sama dengan pangkalan data. Oleh itu, mari kita lancarkan aplikasi dengan Intellij IDEA. Untuk menguji ini, kami perlu menjalankan kaedah utama kami dalam JavarushTelegramBotApplication. Untuk memisahkan kerja penempatan dan ujian, kami akan menggunakan fail lain dengan sifat - application-test.properties . Dengan templat ini, kami memberitahu Spring bahawa fail ini akan digunakan untuk profil ujian . Apabila kami tidak menentukan profil, profil lalai digunakan (semak ini dalam log anda semasa menjalankan SpringBoot: ia akan ditulis tentang perkara ini dalam baris pertama). Inilah yang akan kelihatan seperti:
# 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
Dan application.properties utama akan kelihatan berbeza sedikit:
# 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
Perbezaan ketara adalah dalam medan spring.datasource.url: dalam profil ujian kami mempunyai URL pada localhost . Iaitu, aplikasi dijangka berjalan di luar Docker, yang benar, kerana apabila penyahpepijatan kami akan menjalankan projek kami dalam Intellij IDEA dan menjangkakan kami akan mempunyai akses kepada pangkalan data dari mesin tempatan. Tetapi dalam application.properties URL, satu lagi sudah ditentukan - jrtb-db . Ini akan menjadi nama pangkalan data kami dalam docker-compose, dan dengan cara ini aplikasi docker kami akan dapat mencapai pangkalan data. kenapa? Oleh itu, mereka akan melancarkan dalam docker-compose yang sama dan akan mengetahui tentang satu sama lain dengan cara ini. Ini adalah perlu supaya kita mempunyai satu infrastruktur tertutup untuk projek itu. Tetapi bagaimana untuk melancarkan profil pada permulaan? Untuk melakukan ini, anda boleh mengkonfigurasi pelancaran kaedah utama dalam Intellij IDEA. Untuk ini, terdapat Edit Konfigurasi : pergi ke kelas utama JavarushTelegramBotApplication, klik pada anak panah hijau di sebelah pengisytiharan kaedah utama dan pilih Modify Run Configuration : "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 10Masukkan pembolehubah yang diperlukan dan konfigurasikan profil. Dalam Intellij IDEA, antara muka tetingkap konfigurasi ini telah berubah sedikit, jadi saya menasihati semua orang untuk mengemas kini IDEA kepada versi terkini supaya kita melihat gambar yang sama: "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 11Dalam medan Pembolehubah persekitaran , kita perlu menambah nama bot dan pembolehubah token menggunakan templat berikut: variable_name1=value1; variable_name2=value2 . Iaitu, key=value dipisahkan oleh titik bertitik. Dalam kes kami ia akan menjadi seperti ini: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (anda akan mempunyai nama dan token yang berbeza untuk bot) Seterusnya, pilih medan Tambah pilihan VM dalam butang Ubah suai pilihan : Tulis : -Dspring.profiles.active =test - ini akan memberitahu SpringBoot untuk menggunakan profil ujian, yang bermaksud sifat akan diambil daripada application-test.properties. Hasilnya, ia akan kelihatan seperti ini: Sekarang kami melancarkan pangkalan data ujian kami: docker-compose -f docker-compose-test.yml up Dan betul-betul dengan cara ini, tanpa awalan -d, supaya log boleh dilihat dengan segera dalam terminal, jika ada yang diperlukan. Dan langkah terakhir adalah dengan hanya menjalankan kaedah utama. Jika anda melakukan segala-galanya dengan cara yang sama seperti yang saya nyatakan, anda akan mendapat: Baris kedua log akan menjadi penerangan tentang perkara yang telah diperolehi oleh profil ujian. Kami melalui MySQLWorkbench dan menjalankan dua arahan untuk memeriksa sama ada penghijrahan telah dilancarkan dan semuanya berfungsi (walaupun ini dapat dilihat dari log pelancaran aplikasi, ia pasti bernilai diperiksa):"Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 12"Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 13"Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 14
  1. gunakan dev_jrtb_db;
  2. tunjukkan jadual;
Keputusan: "Projek Java dari A hingga Z": Menambah semua yang berkaitan dengan pangkalan data.  Bahagian 1 - 15Seperti yang kami jangkakan, kami mendapat dua meja. Yang pertama adalah teknikal untuk perakaunan migrasi, yang kedua ialah jadual kami untuk pengguna Telegram. Semua: Laluan terbang bersama pangkalan data telah ditambah. Kini migrasi baharu akan berjalan seperti jam. Perkara yang paling sukar ialah persediaan pertama dan pelancaran proses. Sebagai kesinambungan , kami sedang menyelesaikan kerja pada tugas global ini: menambahkan pangkalan data pada docker-compose.yml, menambahkan lapisan Repositori, statistik untuk bot, menulis dan mengemas kini ujian dan dokumentasi.

Senarai semua bahan dalam siri ini adalah pada permulaan artikel ini.

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