JavaRush /Java blogi /Random-UZ /SpringBoot + Flyway - "A dan Zgacha Java loyihasi"

SpringBoot + Flyway - "A dan Zgacha Java loyihasi"

Guruhda nashr etilgan
Java loyihasini yaratish haqidagi turkum maqola (boshqa materiallarga havolalar oxirida). Uning maqsadi - asosiy texnologiyalarni tahlil qilish, natijada telegram botini yozish. Ushbu qismda biz SpringBoot va Flywayni ishga tushirishga harakat qilamiz. Nazariyaning minimal miqdori, siz xohlaganingizdek))) Biz Flyway/Liquibase-ni noma'lum muddatga yakuniy taqqoslashni o'tkazib yuboramiz va nuqtaga o'tamiz. Va shunga qaramay, u allaqachon davom etdi. Flyway-ni ikki marta tasvirlamaslik uchun men uni kelajakdagi JRTB loyihamizga darhol qo'shishga qaror qildim."A dan Zgacha Java loyihasi": SpringBoot + Flyway - 1

Buning bir qismi sifatida nima qilishimiz kerak?

  1. Maven asosidagi SpringBoot dasturini ishga tushiring.
  2. U erda Flyway-ni qo'shing: xayriyatki, ular osongina birlashtiriladi.
  3. Misol ma'lumotlar bazasida mavjud bo'lgan jadvallar uchun sxema qo'shing.
Shunday qilib, biz Flyway bilan qanday ishlashni o'rganamiz. Nega bizning JRTBga darhol emas, balki alohida loyiha? Chunki keyinchalik buni qanday qilishni tushunmoqchi bo'lgan har bir kishi misol bilan loyiha va u bilan ishlashni tasvirlaydigan maqolaga ega bo'ladi. Xo'sh, ketaylik!

Flyway nima

Biror narsani ishlatish uchun avvalo nima ekanligini va nima uchun ekanligini aniqlashingiz kerak. Flyway - ma'lumotlar bazasi versiyasini boshqarish vositasi. So'zlar ma'lum, lekin qandaydir tushunish qo'shilmagan, to'g'rimi? Keling, flyway hal qiladigan muammoni tasvirlashga harakat qilaylik. Aytaylik, bizda loyiha bor. Bizning dunyomizdagi hamma narsa kabi, u mukammal emas, shuning uchun loyihaning yakuniy versiyasini rejalashtirish va tuzish mumkin emas edi. Har safar ma'lum hisobga olinmagan nuanslar paydo bo'ladi. Loyiha o'z ishida ma'lumotlar bazasidan foydalanadi. Albatta, agar loyiha o'zgarsa, ma'lumotlar bazasi tuzilishi ham o'zgarishi mumkin. Aytaylik, loyihamizdagi ob'ektlardan biri uchun yangi maydon qo'shamiz. Buni qanday qilish kerak?
  1. Ushbu maydonni bizning tashkilotimizga qo'shing, biznes mantig'i ishlashi uchun hamma narsani yangilang.
  2. Ma'lumotlar bazasini yangilang. Mumkin bo'lgan yagona usul - buni qo'lda qilish. Buning uchun siz kirishingiz va kerakli sql skriptini ro'yxatdan o'tkazishingiz kerak.
Ikkinchi nuqta ko'plab savollar tug'diradi:
  1. Ammo agar bizda bir nechta loyihamiz mavjud bo'lsa, ularning har birida buni qilish kerakmi?
  2. va agar biz orqaga qaytmoqchi bo'lsak, ma'lumotlar bazasi strukturasi hozir qanday holatda ekanligini qanday bilamiz?
  3. Ma'lumotlar bazasi o'zgarishi muvaffaqiyatli bo'lganiga qanday ishonch hosil qilishimiz mumkin?
  4. Loyihada sodir bo'lgan barcha ma'lumotlar bazasi o'zgarishlarini kuzatish imkoniyatini qanday olishim mumkin?
Agar siz buni qo'lda qilsangiz, javoblar eng yaxshi bo'lmaydi ... Bu qiyinchiliklarning oldini olish uchun siz ma'lumotlar bazasini ko'chirish vositasidan foydalanishingiz mumkin. Ulardan biri Flyway. Uning ishi nima? Loyihaning bir qismi sifatida biz alohida SQL fayllarini (migratsiya deb ataladi) saqlaymiz, ular bir vaqtning o'zida ma'lumotlar bazasi bilan qilgan barcha ishlarni saqlaydi. Barcha migratsiya qat'iy ravishda ma'lum bir tartibda sodir bo'ladi, bu sizga ma'lumotlar bazasining tuzilishi va ma'lumotlaridagi o'zgarishlarni kuzatish imkonini beradi (ko'pincha, migratsiya yordamida sinov ma'lumotlari loyihaga qo'shiladi, shunda u ba'zi serverga o'rnatilganda, u allaqachon ba'zi ma'lumotlarga ega bo'ladi. loyihani sinab ko'rishingiz mumkin bo'lgan qiymatlar). Sinovlardan o'tgandan so'ng, loyiha qurilganda migratsiya boshlanadi. Ular ma'lumotlar bazasiga ulanadi va migratsiyani amalga oshiradi. Agar ushbu ma'lumotlar bazasida migratsiya allaqachon amalga oshirilgan bo'lsa, u holda flyway ularni shunchaki o'tkazib yuboradi (u migratsiya va ularning holati to'g'risidagi ma'lumotlarni ma'lumotlar bazasida alohida jadvalda saqlaydi, bu ularni boshqarishga yordam beradi) va agar ba'zi migratsiya muvaffaqiyatsiz bo'lsa, u holda loyiha qurish va uni serverga o'rnatish (joylashtirish) to'xtatiladi. Men buni iloji boricha batafsil tasvirlashga harakat qildim. Agar hamma narsa hali ham to'liq aniq bo'lmasa, bu muhim emas: amaliyot bilan tushunish keladi.

SpringBoot + Flyway-ni ishga tushiring

Spring Boot nima

Biz nimani ishga tushirmoqdamiz?... Nima va nima uchun qilayotganimizni tushunish uchun SpringBoot nima ekanligini hal qilishingiz kerak. Birinchidan, tez (yaxshi, juda tez) Bahor haqida gapiraylik . Hozirgi vaqtda bu Java-da server ilovalarini ishlab chiqishda de-fakto sanoat standartidir. Nimaning standarti? Buni sizga qanday tushuntira olaman? Bahor - bu dasturning skeleti bo'lib, biz unga "go'sht" ni tashlaymiz - bizning biznes mantiqimiz. Bahorning yordami bilan (bundan keyin men tillarni o'zgartirishga vaqtni behuda sarf qilmaslik uchun men ushbu kuzatuv qog'ozidan foydalanaman: D)) Bahor bizga hamma narsani qilishni boshlaydigan boshlanishni beradi. Bu ko'p qirrali, ko'p modulli:
  1. Ma'lumotlar bazasi bilan ishlashni xohlaysizmi? Siz munosabatlarni xohlaysizmi? Siz aloqasiz bo'lishni xohlaysizmi? Mana biz Spring Data bilan.
  2. http so'rovlari bilan ishlashni xohlaysizmi? Mana, Spring web (Spring MVC).
  3. Sizga bir joyda barcha ob'ektlaringiz uchun konteyner kerakmi? Mana bahor yadrosi.
  4. Turli rollar va buyruqlar zanjiri mavjud bo'lishi uchun loyihada xavfsizlikni o'rnatishingiz kerakmi? Bahor xavfsizligi.
  5. Bunday narsaga ega bo'lish yaxshi bo'ladi deb o'ylaganingizda, bahorda sizga kerak bo'lgan narsa allaqachon mavjud va u tez va oson birlashadi.
Shu bois, bu shunchaki ramka (bunday ulkan kutubxona) emas, balki jadal sur'atlar bilan rivojlanayotgan butun bir ekotizim deyishimiz mumkin. Spring Core nima ekanligini, ya'ni modullar ulangan bazani tushunish uchun sizga o'z ramkangizni yaratish bo'yicha jonli demo tomosha qilishni maslahat beraman. Uni Java va Bahor sohasida juda ajoyib yigit Evgeniy Borisov olib boradi. U qilgan hamma narsani qiling, shunda bahor ishi sizga yanada aniqroq bo'ladi. SpringBoot, o'z navbatida, ularda mavjud bo'lgan hamma narsaning eng yuqori cho'qqisidir. Toza suvning sehri. Ilovani birinchi marta ishga tushirish uchun minimal sozlamalar. Albatta, bu sizga uni qanday ishlatish va nima qilish kerakligi haqida tushuncha bermaydi. Ammo rivojlanishning chuqurligiga shoshilmasdan oldin, hamma narsaga qush ko'zi bilan qarash kerak.

SpringBoot ishga tushirilmoqda

Maven nima ekanligini allaqachon tushunganimiz uchun keling, ehtiyojlarimiz uchun yangi loyiha yarataylik. Buni amalga oshirish uchun siz ushbu masala uchun maxsus yaratilgan veb-saytga kirishingiz kerak. U Spring Initializr deb ataladi . "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 2Bu erda siz to'ldirishingiz va kerakli narsani tanlashingiz kerak:
  1. Loyihani yaratish vositasi gradle yoki maven hisoblanadi. Ko'rib turganingizdek, chumoli endi tilga olinmaydi. Bu qaysi qurilish asboblari vaqtingizga arziydiganligi haqida yaxshi maslahat.
  2. Siz yozishingiz mumkin bo'lgan til - java, kotlin, groovy. Bu erda hamma narsa oddiy: ularning barchasi JVM-ga o'xshaydi va Java kodini osongina boshqaradi. Aytgancha, Kotlinga qarashga arziydi. Ochig'ini aytganda, Groovy qiziqsiz bo'lib qoldi (ular trubalarga o'tgan vaqtlari bor edi, lekin u tezda o'tib ketdi).
  3. Bahor versiyasi ... Bu erda siz Bahorning asosiy qismi va uning modullarining versiyalari mos kelishini tushunishingiz kerak.
  4. Loyiha ma'lumotlari. Men bu narsalarni allaqachon tasvirlab berganman.
  5. Qaysi arxiv to'planishini tanlaymiz - Jar yoki War.
  6. Xo'sh, bizning sevimli dasturimizning Java versiyasi. Va yaqinda bunday versiyalar juda ko'p bo'ldi ... Ular yillar davomida kutishdi, endi esa yiliga ikkitasi bor.
Bizning holatda, biz ushbu loyihani JavaRush Community tashkilotida nashr qilamiz , shuning uchun loyiha haqidagi ma'lumotlar mos keladi:
  1. Maven - bu haqda avval siz bilan gaplashganimiz bejiz emas.
  2. Java bizning azizim: D
  3. Keling, 2.2.11 versiyasini olaylik. Nega eng yangisi emas? Chunki u qanchalik yangi bo'lsa, u erda xatolar bo'lishi ehtimoli shunchalik yuqori bo'ladi. Biz uchun qaysi versiya muhim emas, lekin eskisi ishonchliroq bo'ladi. Shuning uchun biz 2.2.11 ni tanlaymiz.
  4. Guruh: com.github.javarushcommunity
  5. Artifakt: springboot-flyway-demo
  6. Nomi: SpringBoot + Flyway demo
  7. Tavsif: Loyiha SpringBoot va Flyway o'rtasidagi integratsiyani namoyish etadi . (Ha, hujjatlarni yozish qobiliyati rivojlanishning muhim qismidir :))
  8. Paket nomi: com.github.javarushcommunity.springbootflywaydemo . Bu erda ular darhol biz uchun dasturimizni ishga tushiradigan sinf bilan asosiy paketni yaratadilar.
  9. Qadoqlash: banka
  10. Java: 8. Keling, lokomotivdan oldinga bormaylik va eski sakkizlikni olmaymiz. Nega 11 emas? Nima sababdan? Bizning misolimiz uchun men nuqtani ko'rmayapman.
"A dan Zgacha Java loyihasi": SpringBoot + Flyway - 3Endi modullarni qo'shamiz. Biz Flyway bilan integratsiyani topishimiz kerak. Bundan tashqari, MySQL va Spring Data bilan bog'liq narsalarni qo'shishingiz mumkin. Keling, yana bir lombok qo'shamiz (bu juda kerakli narsa, hozircha menga ishoning :D)) Buning uchun QO'SHIMCHILIKLAR ... tugmasini bosing va kerakli narsani tanlang: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 4Flywayni shunday qo'shamiz. "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 5Lombok... Va hokazo. Natijada, biz olamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 6Ha... biz hamma narsani to'ldirdik)) Endi GENERATE tugmasini bosing ... va tamom - yaratilgan loyiha bilan arxiv tayyor :) Shuningdek, SHARE kabi ajoyib narsa bor ... , bu sizga hozirgina to'ldirgan sahifaga havola beradi. Ya'ni, men yaratgan narsa shu . Va agar biror narsa noto'g'ri bo'lsa ham, siz har doim havoladan foydalanib tekshirishingiz mumkin. Keyinchalik, yaratilgan loyihani Git omboriga ulashimiz kerak, shuning uchun biz yaratilgan springboot-flyway-demo loyihasini klonlaymiz va IDEA orqali yuklab olamiz. Buning uchun siz g'oyani ochishingiz va Fayl -> Yangi -> Mavjud manbalardan loyihani tanlashingiz kerak... : "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 7Endi URL manzilini qo'shing va Klonlash ni bosing . Keyingi qadam, yaratilgan loyihaning ichki qismlarini biz klonlagan loyiha ichiga o'tkazishdir. Adashib qoldingizmi? Men sizga hozir ko'rsataman. Men uni ochdim va quyidagi fayllar to'plamini oldim: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 8Ular klonlangan loyihaga o'tkazilishi kerak. Oldingi maqolada bo'lgani kabi, keling, pom.xml ni maven loyihasi sifatida qo'shamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 9Endi biz biz uchun yaratilgan narsalarni ko'rib chiqishga qiziqamiz. Agar siz src va undan keyingi barcha papkalarni ochsangiz, biz avvalgi maqolada muhokama qilgan Maven loyihalarida odatiy ierarxiyani ko'rasiz . O'qimaganlar uchun o'qing! "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 10Ko'rinib turibdiki, bizda Ilovalar sinfi bor va bizning SpringBoot ilovamiz undan foydalanib ishga tushiriladi. SpringBoot uchun Maven plagini tufayli endi bizda Maven uchun kerakli vazifa bor, ya'ni spring-boot:run. Ushbu ma'lumotni qayerdan topishimiz mumkin? O'ng tomonda, Maven plitasini va bizning loyihamizni ochamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 11Xato bo'ladi va biz uni o'qiy olmaymiz, biz shunga o'xshash narsani ko'ramiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 12Qo'shimcha ma'lumot olish uchun tezlik uchun biz asosiy usulni ishga tushirishimiz mumkin. Ilova sinfi: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 13Va keyin biz haqiqiy sababni ko'ramiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 14Bu erda allaqachon ko'proq ma'lumot bor va siz u bilan biror narsa qilishingiz mumkin. Nima bo'ldi? Bizda ma'lumotlar bazasi bilan bog'liq bo'lgan bog'liqliklar mavjud va shuning uchun biz unga ulanish uchun sozlamalarni taqdim etishimiz kerak. Buning uchun biz google-da qidiramiz va application.properties-ga quyidagi konfiguratsiyalarni qo'shishimiz kerakligini aniqlaymiz:
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
Biz yana asosiy usulni ishga tushiramiz va olamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 15Endi kamida bitta migratsiya qo'shishimiz kerak. Migratsiyani to‘g‘ri yaratish uchun quyidagi shablonni olishingiz kerak: V<VERSION>__<NAME>.sql Ushbu shablondan foydalanib, tegishli papkada V00001__Create_country_table.sql nomli migratsiya faylini yaratamiz : /src/main/resources/ db.migration/ . Unda mamlakat jadvalini tuzamiz. Keling, ma'lumotlar bazasi haqidagi ikkinchi maqoladan skriptni olaylik . "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 16Boshlashdan oldin, keling, ish uchun ma'lumotlar bazasini yarataylik: flyway_demo_db. Buni MysqlWorkbench orqali amalga oshiramiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 17Endi biz asosiy usulni yana ishga tushirishimiz mumkin: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 18Hammasi amalga oshdi, lekin bizda hali loyihada hech narsa yo'qligi sababli u ishlay boshladi. Biroq, jurnallardan ( jurnallar nima ekanligini o'qing ) aniq:
  1. Ma'lumotlar bazasiga muvaffaqiyatli ulandi.
  2. Migratsiya tasdiqlandi va hammasi joyida.
  3. Flyway migratsiyalarni boshqarish uchun jadval yaratdi.
  4. Va qanday migratsiya 00001 boshlandi - mamlakatning yaratilishi muvaffaqiyatli bo'ldi.
Buni tekshirish uchun siz borib, ma'lumotlar bazasida nima qilinayotganini ko'rishingiz mumkin. Shunday qilib, keling, MySQL serverimizga boramiz va flyway_demo_db ma'lumotlar bazasidagi jadvallar bilan nima sodir bo'layotganini ko'rib chiqamiz: $ Flyway_demo_db USE; $JADVALLARNI KO'RSATISH; "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 19Men kutganimdek, migratsiya sodir bo'ldi, uning davomida mamlakat jadvali yaratildi va migratsiya haqidagi ma'lumotlarni saqlaydigan flyway_schema_history jadvali paydo bo'ldi. Keling, oldinga boramiz va qanday yozuvlar borligini (va umuman bor yoki yo'qligini) ko'rib chiqamiz. $SELECT * FROM flyway_schema_history; "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 20Mana bu yozuv, yagona. Unda juda ko'p qiziqarli ma'lumotlar mavjud. Versiya, migratsiya tavsifi, qanday turdagi SQL (va balki XML ham bo‘lishi mumkin), skriptning o‘zi nomi, nazorat summasi ( bu migratsiya o‘zgargan yoki o‘zgarmaganligini tekshirish uchun ishlatiladigan xeshkodga o‘xshash narsa. Bu amalga oshiriladi. agar biz ma'lumotlar bazasida migratsiyani amalga oshirgan bo'lsak va keyin u tuzatilgan bo'lsa: buni amalga oshirish mumkin emas, barcha o'zgarishlar faqat yangi migratsiya orqali amalga oshiriladi va buning oldini olish uchun chek miqdori buni nazorat qiladi ) , foydalanuvchi sql nomi, migratsiya jarayoni sana, bajarilish vaqti va natijasi (muvaffaqiyatli yoki muvaffaqiyatsiz) . Bir marta yozilgan migratsiya kelajakda o'zgartirilmasligi kerak. Unda nuqson bo'lsa ham. Barcha o'zgarishlar faqat yangi migratsiya orqali amalga oshiriladi. Bu juda muhim. Nima bo'lishini ko'rsatish uchun keling, skriptimizni biroz o'zgartirib, uni qayta ishga tushirishga harakat qilaylik. Migratsiyamizda mamlakat jadvaliga bitta yozuv qo‘shamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 21va asosiy usulni ishga tushiramiz va biz shunday natijaga erishamiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 22men kutganimdek, flyway skript o‘zgartirilganligini tan oldi va ko‘chirishni amalga oshirmadi. Ba'zi hollarda, aslida yangilangan migratsiyani amalga oshirish kerak bo'lishi mumkin va flyway buni o'tkazib yuborishi uchun flyway_schema_history jadvalidagi yozuvni o'chirishingiz va keyin yangilangan migratsiyani ishga tushirishingiz kerak. Bu oddiy xatti-harakatlar emas va bunday bo'lmasligi kerak, lekin siz muammoni hal qilishning ushbu usuli haqida ham bilishingiz kerak. Biz birinchi migratsiya bilan shug'ullandik. Endi men ma'lumotlar bazasi haqidagi maqolada bo'lgani kabi, mamlakatlar haqidagi ma'lumotlar bilan yana bir migratsiyani qo'shmoqchiman: fayl V00002__Add_test_data_to_country.sql"A dan Zgacha Java loyihasi": SpringBoot + Flyway - 23 Va yana asosiy usulni ishga tushiramiz: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 24Jurnallardan ko'rinib turibdiki, migratsiya boshlanishidan oldin ma'lumotlar bazasi bo'lgan. 00001 versiyasida, shuning uchun ushbu versiyadan keyingi barcha migratsiyalar. Keyinchalik, 00002 versiyasi ishga tushirildi va muvaffaqiyatli bo'ldi. Keling, tekshirib ko'raylik yoki mamlakatdagi uchta yozuv allaqachon ma'lumotlar bazasida bo'lishiga ishonasizmi?)) Men tekshiraman, shuning uchun isbot: "A dan Zgacha Java loyihasi": SpringBoot + Flyway - 25Shunga o'xshash narsa. Agar siz loyihani qayta ishga tushirsangiz, ma'lumotlar bazasi talab qilingan versiyaga to'liq mos kelganligi sababli flyway ko'chirishni o'tkazib yuboradi.

Xulosa

Bu safar biz SpringBoot bilan birgalikda ma'lumotlar bazasini ko'chirish vositasini tushunish va undan foydalanishni o'rgandik. Ushbu ma'lumot Flyway misolida ma'lumotlar bazasi versiyasini boshqarish vositasi nima ekanligini tushunish uchun zarur. Do'stlar, men ko'rsatgan loyihaning manba kodi bizning tashkilotimizda Github-da nashr etilgan . Agar sizga misol yoqsa, unga yulduzcha qo'ying va men ishim foydali va haqiqatan ham davom ettirishga arziydiganligini tushunaman. An'anaga ko'ra, men Github hisobimga obuna bo'lishni taklif qilaman . U orqali men barcha ishimni ochiq manbalar va maqolalarimga doimo hamroh bo'ladigan barcha demo loyihalar ustida olib boraman. O'qiganingiz uchun barchaga rahmat. Keyingi safar arizamizni yozamiz. Kelajakda Docker-da kerakli nazariya bo'ladi, ammo biz uni amaliyot bilan juda suyultiramiz.

foydali havolalar

Bugungi kunda juda ko'p foydali havolalar mavjud emas. Evgeniyning videosiga e'tibor bering, bu haqiqatan ham bunga arziydi!
  1. Bahorda loyihalar yaratish uchun veb-sayt
  2. Evgeniy Borisov - bahor quruvchisi
  3. Flyway uchun bahorda hujjatlar

Seriyadagi barcha materiallar ro'yxati ushbu maqolaning boshida.

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