JavaRush /Blog Java /Random-MS /SpringBoot + Flyway - "Projek Java dari A hingga Z"

SpringBoot + Flyway - "Projek Java dari A hingga Z"

Diterbitkan dalam kumpulan
Artikel daripada siri tentang mencipta projek Java (pautan ke bahan lain ada di penghujung). Matlamatnya adalah untuk menganalisis teknologi utama, hasilnya menulis bot telegram. Dalam bahagian ini, kami cuba melancarkan SpringBoot dan Flyway. Jumlah minimum teori, seperti yang anda suka))) Kami meninggalkan perbandingan terakhir Flyway/Liquibase untuk tempoh masa yang tidak ditentukan dan sampai ke intipati. Dan walaupun begitu ia telah pun berlarutan. Untuk tidak menerangkan Flyway dua kali, saya memutuskan untuk segera menambahkannya pada projek JRTB kami yang akan datang."Projek Java dari A hingga Z": SpringBoot + Flyway - 1

Apa yang perlu kita lakukan sebagai sebahagian daripada ini?

  1. Lancarkan aplikasi SpringBoot berdasarkan Maven.
  2. Tambah Flyway di sana: nasib baik, ia mudah disepadukan.
  3. Tambah skema untuk jadual yang kami ada dalam pangkalan data contoh.
Dengan cara ini kita akan belajar cara bekerja dengan Flyway. Mengapa projek yang berasingan, dan tidak serta-merta ke dalam JRTB kami? Kerana kemudian, sesiapa yang ingin memahami cara melakukan ini akan mempunyai projek dengan contoh dan artikel yang menerangkan bekerja dengannya. Baik, mari pergi!

Apa itu flyway

Untuk menggunakan sesuatu, anda perlu mengetahui terlebih dahulu apa itu dan mengapa. Flyway ialah alat kawalan versi pangkalan data. Kata-kata itu sudah diketahui umum, tetapi entah bagaimana pemahamannya belum ditambah, bukan? Mari cuba huraikan masalah yang diselesaikan oleh flyway. Katakan kita ada projek. Seperti segala-galanya di dunia kita, ia tidak sempurna, jadi tidak mungkin untuk merancang dan merangka versi akhir projek itu. Setiap kali nuansa tertentu yang tidak diketahui muncul. Projek ini menggunakan pangkalan data dalam kerjanya. Sudah tentu, jika projek berubah, struktur pangkalan data juga mungkin berubah. Katakan kami menambah medan baharu untuk salah satu entiti dalam projek kami. Bagaimana hendak melakukannya?
  1. Tambahkan medan ini pada entiti kami, kemas kini segala-galanya supaya logik perniagaan berfungsi.
  2. Kemas kini pangkalan data. Satu-satunya cara yang mungkin ialah melakukannya secara manual. Untuk melakukan ini, anda perlu masuk dan mendaftarkan skrip sql yang diperlukan.
Perkara kedua menimbulkan banyak persoalan:
  1. Tetapi jika kita mempunyai lebih daripada satu tempat di mana kita menggunakan projek kita, maka adakah ini perlu dilakukan di setiap daripada mereka?
  2. dan jika kita ingin kembali, bagaimana kita tahu dengan tepat keadaan struktur pangkalan data sekarang?
  3. Bagaimanakah kita akan memastikan bahawa perubahan pangkalan data berjaya?
  4. Bagaimanakah saya boleh mendapat peluang untuk menjejaki semua perubahan pangkalan data yang berlaku pada projek?
Jika anda melakukannya secara manual, jawapannya tidak akan menjadi yang terbaik... Untuk mengelakkan semua kesulitan ini, anda boleh menggunakan alat migrasi pangkalan data. Salah satunya ialah Flyway. Apa kerja dia? Sebagai sebahagian daripada projek, kami menyimpan fail sql berasingan (yang dipanggil migrasi), yang menyimpan semua yang kami lakukan dengan pangkalan data pada satu masa. Semua migrasi berlaku dengan ketat dalam susunan tertentu, yang membolehkan anda menjejaki perubahan dalam struktur dan data pangkalan data (selalunya, menggunakan migrasi, data ujian ditambahkan pada projek supaya apabila ia digunakan ke beberapa pelayan, ia sudah mempunyai beberapa nilai yang anda boleh menguji projek). Selepas ujian lulus, migrasi dilancarkan apabila projek dibina. Mereka menyambung ke pangkalan data dan melakukan migrasi. Jika migrasi telah dijalankan pada pangkalan data ini, maka flyway hanya akan melangkaunya (ia menyimpan data mengenai migrasi dan statusnya dalam jadual berasingan dalam pangkalan data, yang membantu mengurusnya), dan jika beberapa migrasi tidak berjaya, maka projek itu bina dan pemasangannya (pengerahan) ke pelayan akan berhenti. Saya cuba menerangkannya sedetail mungkin. Sekiranya semuanya masih belum jelas sepenuhnya, tidak mengapa: dengan latihan, pemahaman akan datang.

Lancarkan SpringBoot + Flyway

Apa itu Spring Boot

Apakah yang kami lancarkan?... Untuk memahami apa dan mengapa kami lakukan, anda perlu memutuskan apa itu SpringBoot. Mula-mula, mari cepat (baik, sangat cepat) bercakap tentang Spring . Pada masa ini, ia adalah standard industri de facto dalam membangunkan aplikasi pelayan di Jawa. Standard apa? Bagaimana saya boleh menjelaskan perkara ini kepada anda? Musim bunga adalah rangka aplikasi, di mana kami kemudian membuang "daging" - logik perniagaan kami. Dengan bantuan Spring (selepas ini saya akan menggunakan kertas surih ini supaya tidak membuang masa menukar bahasa :D)) Spring memberi kita permulaan dari mana kita mula melakukan segala-galanya. Ia berbilang segi, berbilang modular:
  1. Adakah anda mahu bekerja dengan pangkalan data? Adakah anda mahu hubungan? Adakah anda mahu tidak berkaitan? Di sini kita dengan Spring Data.
  2. Adakah anda mahu bekerja dengan permintaan http? Ini dia, Spring web (Spring MVC).
  3. Adakah anda memerlukan bekas untuk semua objek anda di satu tempat? Inilah Spring Core.
  4. Adakah anda perlu menyediakan keselamatan pada projek supaya terdapat peranan dan rantaian arahan yang berbeza? Keselamatan Musim Bunga.
  5. Hanya apabila anda fikir adalah bagus untuk memiliki perkara sedemikian, ternyata Spring sudah mempunyai apa yang anda perlukan, dan ia berintegrasi dengan cepat dan mudah.
Oleh itu, kita boleh mengatakan bahawa ini bukan sekadar rangka kerja (perpustakaan yang begitu besar), tetapi keseluruhan ekosistem yang sedang berkembang dengan pantas. Untuk memahami apa itu Spring Core, iaitu, pangkalan modul yang disambungkan, saya menasihati anda untuk menonton demo langsung tentang mencipta rangka kerja anda sendiri. Ia dihoskan oleh Evgeny Borisov, seorang lelaki yang sangat keren dalam bidang Java dan Spring. Lakukan semua yang dia lakukan, dan kerja musim bunga akan menjadi lebih jelas kepada anda. SpringBoot pula adalah kemuncak segala yang mereka miliki. Keajaiban air tulen. Tetapan minimum untuk membuat pelancaran pertama aplikasi. Sudah tentu, ini tidak akan memberi anda pemahaman tentang cara menggunakannya dan apa yang perlu dilakukan. Tetapi sebelum bergegas ke kedalaman pembangunan, anda perlu melihat segala-galanya dari pandangan mata burung.

Melancarkan SpringBoot

Memandangkan kita sudah faham apa itu Maven, mari kita buat projek baharu untuk keperluan kita. Untuk melakukan ini, anda hanya perlu pergi ke tapak web yang dicipta khas untuk perkara ini. Ia dipanggil Spring Initializr . "Projek Java dari A hingga Z": SpringBoot + Flyway - 2Di sini anda perlu mengisi dan memilih apa yang anda perlukan:
  1. Alat binaan projek ialah gradle atau maven. Seperti yang anda lihat, Semut tidak lagi disebut. Ini adalah petunjuk yang baik tentang alat binaan yang bernilai masa anda.
  2. Bahasa yang anda boleh tulis ialah java, kotlin, groovy. Semuanya mudah di sini: semuanya seperti JVM dan mudah menjalankan kod Java. By the way, ia patut melihat Kotlin. Groovy terus terang menjadi tidak menarik (ada masanya mereka beralih kepada alur, tetapi ia cepat berlalu).
  3. Versi Spring... Di sini anda perlu memahami bahawa versi bahagian utama Spring dan modulnya adalah konsisten.
  4. Data projek. Saya telah pun menerangkan perkara-perkara ini.
  5. Kami memilih arkib yang akan dikumpul - Jar atau Perang.
  6. Nah, versi Java kegemaran kami. Dan baru-baru ini terdapat banyak versi ini... Mereka menunggu selama bertahun-tahun, dan kini terdapat dua versi setahun.
Dalam kes kami, kami akan menerbitkan projek ini dalam organisasi Komuniti JavaRush , jadi maklumat tentang projek itu sesuai:
  1. Maven - bukan sia-sia kami bercakap dengan anda tentang perkara ini sebelum ini.
  2. Jawa adalah kesayangan kami :D
  3. Mari ambil versi 2.2.11. Kenapa bukan yang terbaru? Kerana lebih baru, lebih besar kemungkinan terdapat beberapa pepijat di sana. Bagi kami, tidak kira versi mana, tetapi versi yang lebih lama akan lebih dipercayai. Oleh itu, kami memilih 2.2.11.
  4. Kumpulan: com.github.javarushcommunity
  5. Artifak: springboot-flyway-demo
  6. Nama: Demo SpringBoot + Flyway
  7. Penerangan: Projek menunjukkan integrasi antara SpringBoot dan Flyway . (Ya, keupayaan untuk menulis dokumentasi adalah bahagian penting dalam pembangunan :))
  8. Nama pakej: com.github.javarushcommunity.springbootflywaydemo . Di sini mereka akan segera membuat pakej asas untuk kami dengan kelas yang akan melancarkan aplikasi kami.
  9. Pembungkusan: Balang
  10. Jawa: 8. Jangan kita mendahului lokomotif dan mengambil lapan lama yang baik. Mengapa tidak 11? Untuk apa? Untuk contoh kami, saya tidak nampak maksudnya.
"Projek Java dari A hingga Z": SpringBoot + Flyway - 3Sekarang mari tambah modul. Kita perlu mencari integrasi dengan Flyway. Anda juga boleh menambah sesuatu yang berkaitan dengan MySQL dan Data Spring. Mari tambah satu lagi lombok (ini adalah perkara yang sangat perlu, percayalah saya buat masa ini :D)) Untuk melakukan ini, klik pada TAMBAH PERGANTUNGAN ... dan pilih semua yang anda perlukan: "Projek Java dari A hingga Z": SpringBoot + Flyway - 4Ini adalah cara kami menambah Flyway. "Projek Java dari A hingga Z": SpringBoot + Flyway - 5Lombok... Dan seterusnya. Hasilnya, kami mendapat: "Projek Java dari A hingga Z": SpringBoot + Flyway - 6Huh... kami mengisi segala-galanya)) Sekarang klik JANA... dan itu sahaja - arkib dengan projek yang dijana sudah sedia :) Terdapat juga perkara yang menarik seperti SHARE... , yang memberi anda pautan ke halaman yang baru anda isikan. Iaitu, inilah yang saya hasilkan . Dan walaupun berlaku masalah, anda sentiasa boleh menyemak menggunakan pautan. Seterusnya, kami perlu memautkan projek yang dibuat ke repositori Git, jadi kami mengklon projek springboot-flyway-demo yang dibuat dan memuat turunnya melalui IDEA. Untuk melakukan ini, anda perlu membuka idea dan pilih Fail -> Baharu -> Projek daripada Sumber Sedia Ada... : "Projek Java dari A hingga Z": SpringBoot + Flyway - 7Sekarang tambah URL dan klik Klon . Langkah seterusnya ialah memindahkan dalaman projek yang dihasilkan di dalam projek yang kami klon. keliru? Saya akan tunjukkan sekarang. Saya membuka zipnya dan menerima set fail berikut: "Projek Java dari A hingga Z": SpringBoot + Flyway - 8Ini perlu dipindahkan ke projek klon. Seperti dalam artikel sebelum ini, mari tambah pom.xml sebagai projek maven: "Projek Java dari A hingga Z": SpringBoot + Flyway - 9Sekarang kami berminat untuk melihat apa yang dihasilkan untuk kami. Jika anda membuka semua folder dalam src dan seterusnya, anda akan melihat hierarki biasa dalam projek Maven, yang kami bincangkan dalam artikel sebelumnya . Bagi yang belum membacanya, bacalah! "Projek Java dari A hingga Z": SpringBoot + Flyway - 10Ia boleh dilihat bahawa kami mempunyai kelas Aplikasi, dan aplikasi SpringBoot kami akan dilancarkan menggunakannya. Terima kasih kepada pemalam Maven untuk SpringBoot, kami kini mempunyai tugas yang kami perlukan untuk Maven, iaitu spring-boot:run. Di manakah kita boleh mendapatkan maklumat ini? Di sebelah kanan, membuka plat Maven dan projek kami: "Projek Java dari A hingga Z": SpringBoot + Flyway - 11Akan ada ralat, dan kami tidak akan dapat membacanya, kami akan melihat sesuatu seperti ini: "Projek Java dari A hingga Z": SpringBoot + Flyway - 12Untuk mendapatkan maklumat lanjut, untuk kelajuan kami boleh menjalankan kaedah utama kelas Aplikasi: "Projek Java dari A hingga Z": SpringBoot + Flyway - 13Dan kemudian kita akan melihat sebab sebenar: "Projek Java dari A hingga Z": SpringBoot + Flyway - 14Di sini sudah terdapat lebih banyak maklumat dan anda boleh melakukan sesuatu dengannya. apa salahnya Kami mempunyai kebergantungan yang dikaitkan dengan pangkalan data, dan oleh itu kami perlu menyediakan tetapan untuk menyambung kepadanya. Untuk melakukan ini, kami google dan mendapati bahawa kami perlu menambah konfigurasi berikut pada 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
Kami menjalankan kaedah utama sekali lagi dan mendapat: "Projek Java dari A hingga Z": SpringBoot + Flyway - 15Sekarang kita perlu menambah sekurang-kurangnya satu penghijrahan. Untuk mengarang migrasi dengan betul, anda perlu mengambil templat berikut: V<VERSION>__<NAME>.sql Menggunakan templat ini, kami akan mencipta fail migrasi bernama V00001__Create_country_table.sql dalam folder yang sesuai: /src/main/resources/ db.hijrah/ . Mari buat jadual negara di dalamnya. Mari kita ambil skrip dari artikel kedua tentang pangkalan data . "Projek Java dari A hingga Z": SpringBoot + Flyway - 16Sebelum bermula, mari masuk dan buat pangkalan data untuk kerja: flyway_demo_db. Mari lakukan ini melalui MysqlWorkbench: "Projek Java dari A hingga Z": SpringBoot + Flyway - 17Sekarang kita boleh menjalankan kaedah utama sekali lagi: "Projek Java dari A hingga Z": SpringBoot + Flyway - 18Semuanya berjaya, tetapi kerana kita belum mempunyai apa-apa dalam projek itu, ia selesai berfungsi. Walau bagaimanapun, jelas daripada log ( baca apakah log itu ) bahawa:
  1. Berjaya disambungkan ke pangkalan data.
  2. Penghijrahan telah disahkan dan semuanya ok.
  3. Flyway telah mencipta jadual untuk mengurus migrasi.
  4. Dan apa penghijrahan 00001 bermula - penciptaan negara berjaya.
Untuk menyemak ini, anda boleh pergi dan melihat apa yang sedang dilakukan dalam pangkalan data. Jadi mari pergi ke pelayan MySQL kami dan lihat apa yang berlaku dengan jadual dalam pangkalan data flyway_demo_db: $ USE flyway_demo_db; $TUNJUKKAN JADUAL; "Projek Java dari A hingga Z": SpringBoot + Flyway - 19Seperti yang saya jangkakan, migrasi berlaku, semasa jadual negara dibuat dan jadual flyway_schema_history muncul, yang menyimpan maklumat tentang migrasi. Mari kita pergi lebih jauh dan lihat apakah rekod yang ada (dan sama ada terdapat sama sekali). $SELECT * DARI flyway_schema_history; "Projek Java dari A hingga Z": SpringBoot + Flyway - 20Inilah rakamannya, satu-satunya. Ia mengandungi banyak data yang menarik. Versi, perihalan penghijrahan, jenis SQL (dan mungkin juga XML), nama skrip itu sendiri, checksum ( ini adalah sesuatu seperti kod cincang, yang digunakan untuk menyemak sama ada migrasi telah berubah atau tidak. Ini dilakukan sekiranya kami menjalankan migrasi dalam pangkalan data dan kemudian ia diperbetulkan: ini tidak boleh dilakukan, semua perubahan dibuat hanya melalui migrasi baharu dan untuk mengelakkan ini daripada berlaku, jumlah cek memantau ini ), nama sql pengguna, pemprosesan migrasi tarikh, masa pelaksanaan dan keputusan (berjaya atau tidak berjaya) . Penghijrahan yang ditulis sekali tidak seharusnya diubah pada masa hadapan. Walaupun terdapat kecacatan padanya. Semua perubahan berlaku hanya melalui penghijrahan baru. Ianya sangat penting. Untuk menunjukkan apa yang akan berlaku, mari kita ubah sedikit skrip kita dan cuba jalankan semula. Mari tambah satu entri pada jadual negara dalam penghijrahan kita: "Projek Java dari A hingga Z": SpringBoot + Flyway - 21dan jalankan kaedah utama dan inilah yang kita dapat: "Projek Java dari A hingga Z": SpringBoot + Flyway - 22Seperti yang saya jangkakan, flyway menyedari bahawa skrip telah diubah dan tidak melakukan migrasi. Dalam sesetengah kes, mungkin perlu menjalankan migrasi yang dikemas kini dan untuk membolehkan laluan terbang melangkau ini, anda perlu memadamkan entri dalam jadual flyway_schema_history dan kemudian menjalankan migrasi yang dikemas kini. Ini bukan tingkah laku biasa dan tidak sepatutnya begitu, tetapi anda juga perlu tahu tentang kaedah menyelesaikan masalah ini. Kami berurusan dengan penghijrahan pertama. Sekarang saya ingin menambah satu lagi penghijrahan, dengan data tentang negara, seperti dalam artikel tentang pangkalan data: fail V00002__Add_test_data_to_country.sql"Projek Java dari A hingga Z": SpringBoot + Flyway - 23 Dan mari jalankan kaedah utama sekali lagi: "Projek Java dari A hingga Z": SpringBoot + Flyway - 24Daripada log adalah jelas bahawa sebelum migrasi bermula, pangkalan data adalah dalam versi 00001, jadi semua migrasi selepas versi ini. Seterusnya, versi 00002 telah dilancarkan dan berjaya. Mari semak, atau adakah anda sudah percaya saya bahawa tiga rekod di negara ini sudah pun berada dalam pangkalan data?)) Saya akan menyemak, jadi bukti: "Projek Java dari A hingga Z": SpringBoot + Flyway - 25Sesuatu seperti ini. Jika anda menjalankan projek itu semula, flyway hanya akan melangkau pelancaran migrasi, kerana pangkalan data mematuhi sepenuhnya versi yang diperlukan.

Kesimpulan

Kali ini kami belajar cara memahami dan menggunakan alat migrasi pangkalan data bersama dengan SpringBoot. Maklumat ini diperlukan untuk memahami apa itu alat kawalan versi pangkalan data, menggunakan Flyway sebagai contoh. Rakan-rakan, kod sumber projek yang saya tunjukkan diterbitkan dalam organisasi kami di Github . Jika anda menyukai contoh itu, berikan bintang dan saya akan faham bahawa kerja saya berguna dan sangat berbaloi untuk diteruskan. Secara tradisinya, saya cadangkan melanggan akaun Github saya . Melalui beliau saya menjalankan semua kerja saya pada sumber terbuka dan semua projek demo yang selalu mengiringi artikel saya. Terima kasih semua kerana membaca. Lain kali kami akan menulis permohonan kami. Akan ada beberapa teori yang diperlukan tentang Docker pada masa hadapan, tetapi kami akan mencairkannya dengan amalan.

pautan yang berguna

Hari ini tidak banyak pautan yang berguna. Perhatikan video Evgeniy, ia sangat berbaloi!
  1. Tapak web untuk mencipta projek pada Spring
  2. Evgeniy Borisov - Pembina musim bunga
  3. Dokumentasi di Spring untuk Flyway

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