JavaRush /Java Blog /Random-TL /SpringBoot + Flyway - "Proyekto ng Java mula A hanggang Z...

SpringBoot + Flyway - "Proyekto ng Java mula A hanggang Z"

Nai-publish sa grupo
Isang artikulo mula sa isang serye tungkol sa paglikha ng isang proyekto ng Java (nasa dulo ang mga link sa iba pang mga materyales). Ang layunin nito ay pag-aralan ang mga pangunahing teknolohiya, ang resulta ay pagsulat ng isang telegram bot. Sa bahaging ito, sinusubukan naming ilunsad ang SpringBoot at Flyway. Ang pinakamababang halaga ng teorya, ayon sa gusto mo))) Inalis namin ang panghuling paghahambing ng Flyway/Liquibase para sa isang hindi tiyak na yugto ng panahon at makarating sa punto. At kahit na ganoon ay nakaladkad na ito. Upang hindi ilarawan nang dalawang beses ang Flyway, nagpasya akong idagdag ito kaagad sa aming hinaharap na proyekto ng JRTB."Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 1

Ano ang kailangan nating gawin bilang bahagi nito?

  1. Ilunsad ang isang SpringBoot application batay sa Maven.
  2. Magdagdag ng Flyway doon: sa kabutihang palad, madali silang isinama.
  3. Magdagdag ng schema para sa mga talahanayan na mayroon kami sa halimbawang database.
Sa ganitong paraan matututunan natin kung paano magtrabaho sa Flyway. Bakit isang hiwalay na proyekto, at hindi kaagad sa aming JRTB? Dahil mamaya, ang sinumang gustong maunawaan kung paano ito gagawin ay magkakaroon ng isang proyekto na may isang halimbawa at isang artikulo na naglalarawan sa pagtatrabaho dito. Tara na!

Ano ang flyway

Upang gumamit ng isang bagay, kailangan mo munang malaman kung ano ito at bakit. Ang Flyway ay isang tool sa pagkontrol ng bersyon ng database. Kilalang-kilala ang mga salita, ngunit kahit papaano ay hindi nadagdagan ang pang-unawa, di ba? Subukan nating ilarawan ang problemang nalulutas ng flyway. Sabihin na nating may project tayo. Tulad ng lahat ng bagay sa ating mundo, hindi ito perpekto, kaya hindi posible na magplano at gumuhit ng panghuling bersyon ng proyekto. Sa bawat oras na lumilitaw ang ilang hindi natukoy na mga nuances. Gumagamit ang proyekto ng isang database sa gawain nito. Siyempre, kung ang proyekto ay nagbabago, ang istraktura ng database ay maaari ring magbago. Sabihin nating nagdagdag kami ng bagong field para sa isa sa mga entity sa aming proyekto. Paano ito gagawin?
  1. Idagdag ang field na ito sa aming entity, i-update ang lahat para gumana ang logic ng negosyo.
  2. I-update ang database. Ang tanging posibleng paraan ay gawin ito nang manu-mano. Upang gawin ito, kailangan mong pumasok at irehistro ang kinakailangang sql script.
Ang pangalawang punto ay nagtataas ng maraming katanungan:
  1. Ngunit kung mayroon tayong higit sa isang lugar kung saan tayo nagde-deploy ng ating proyekto, kailangan ba itong gawin sa bawat isa sa kanila?
  2. at kung gusto nating bumalik, paano natin malalaman kung ano mismo ang estado ng istraktura ng database ngayon?
  3. Paano tayo makatitiyak na matagumpay ang pagbabago ng database?
  4. Paano ako makakakuha ng pagkakataon na subaybayan ang lahat ng mga pagbabago sa database na naganap sa proyekto?
Kung gagawin mo ito nang manu-mano, hindi magiging pinakamahusay ang mga sagot... Upang maiwasan ang lahat ng mga paghihirap na ito, maaari kang gumamit ng tool sa paglilipat ng database. Isa na rito ang Flyway. Ano ang kanyang trabaho? Bilang bahagi ng proyekto, nag-iimbak kami ng hiwalay na mga sql file (tinatawag na migrations), na nag-iimbak ng lahat ng ginagawa namin sa database nang sabay-sabay. Ang lahat ng paglilipat ay mahigpit na nangyayari sa isang tiyak na pagkakasunud-sunod, na nagbibigay-daan sa iyong subaybayan ang mga pagbabago sa istraktura at data ng database (kadalasan, gamit ang paglipat, ang data ng pagsubok ay idinagdag sa proyekto upang kapag ito ay na-deploy sa ilang server, mayroon na itong ilang mga halaga kung saan maaari mong subukan ang proyekto). Matapos ang mga pagsubok na pumasa, ang mga paglilipat ay inilunsad kapag ang proyekto ay binuo. Kumonekta sila sa database at nagsasagawa ng mga paglilipat. Kung naisagawa na ang mga paglilipat sa database na ito, lalaktawan lang sila ng flyway (nag-iimbak ito ng data tungkol sa mga paglilipat at ang kanilang katayuan sa isang hiwalay na talahanayan sa database, na tumutulong na pamahalaan ang mga ito), at kung ang ilang paglipat ay hindi nagtagumpay, ang proyekto ay build at ang pag-mount nito (deployment) sa server ay titigil. Sinubukan kong ilarawan ito nang detalyado hangga't maaari. Kung ang lahat ay hindi pa rin ganap na malinaw, hindi mahalaga: sa pagsasanay, darating ang pag-unawa.

Ilunsad ang SpringBoot + Flyway

Ano ang Spring Boot

Ano ang ilulunsad namin?... Upang maunawaan kung ano at bakit namin ginagawa, kailangan mong magpasya kung ano ang SpringBoot. Una, mabilis (mabuti, napakabilis) pag-usapan natin ang Spring . Sa ngayon, ito ang de facto na pamantayan ng industriya sa pagbuo ng mga application ng server sa Java. Pamantayan ng ano? Paano ko ito ipapaliwanag sa iyo? Ang tagsibol ay ang balangkas ng aplikasyon, kung saan itatapon namin ang "karne" - ang lohika ng aming negosyo. Sa tulong ng Spring (simula dito ay gagamitin ko itong tracing paper upang hindi mag-aksaya ng oras sa pagpapalit ng mga wika :D)) Binibigyan tayo ng Spring ng simula kung saan sinimulan nating gawin ang lahat. Ito ay multi-faceted, multi-modular:
  1. Gusto mo bang magtrabaho sa isang database? Gusto mo ba ng relational? Gusto mo ba ng non-relational? Narito kami sa Spring Data.
  2. Gusto mo bang magtrabaho sa mga kahilingan sa http? Eto na, Spring web (Spring MVC).
  3. Kailangan mo ba ng isang lalagyan para sa lahat ng iyong mga bagay sa isang lugar? Narito ang Spring Core.
  4. Kailangan mo bang mag-set up ng seguridad sa isang proyekto upang magkaroon ng iba't ibang tungkulin at chain of command? Seguridad sa tagsibol.
  5. Sa sandaling naisip mo na magiging maganda ang magkaroon ng ganoong bagay, lumalabas na mayroon na ang Spring ng kailangan mo, at mabilis at madali itong nagsasama.
Samakatuwid, masasabi nating hindi lamang ito isang balangkas (tulad ng napakalaking aklatan), ngunit isang buong ekosistema na umuunlad sa napakabilis na bilis. Upang maunawaan kung ano ang Spring Core, iyon ay, ang batayan kung saan konektado ang mga module, ipinapayo ko sa iyo na manood ng isang live na demo sa paglikha ng iyong sariling balangkas. Ito ay hino-host ni Evgeny Borisov, isang napaka-cool na tao sa larangan ng Java at Spring. Gawin ang lahat ng kanyang ginawa, at ang gawain ng tagsibol ay magiging mas malinaw sa iyo. SpringBoot, sa turn, ay ang tuktok ng lahat ng mayroon sila. Ang magic ng purong tubig. Minimum na mga setting upang gawin ang unang paglulunsad ng application. Siyempre, hindi ito magbibigay sa iyo ng pang-unawa kung paano ito gagamitin at kung ano ang gagawin. Ngunit bago magmadali sa kalaliman ng pag-unlad, kailangan mong tingnan ang lahat mula sa view ng isang ibon.

Inilunsad ang SpringBoot

Dahil naintindihan na natin kung ano ang Maven, gumawa tayo ng bagong proyekto para sa ating mga pangangailangan. Upang gawin ito, kailangan mo lamang pumunta sa isang website na espesyal na nilikha para sa bagay na ito. Ito ay tinatawag na Spring Initializr . "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 2Dito kailangan mong punan at piliin kung ano ang kailangan mo:
  1. Ang tool sa pagbuo ng proyekto ay gradle o maven. Tulad ng makikita mo, hindi na binanggit ang Ant. Ito ay isang magandang pahiwatig tungkol sa kung aling mga tool sa pagbuo ang sulit sa iyong oras.
  2. Ang wikang maaari mong isulat ay java, kotlin, groovy. Ang lahat ay simple dito: lahat sila ay katulad ng JVM at madaling magpatakbo ng Java code. Sa pamamagitan ng paraan, ito ay nagkakahalaga ng pagtingin sa Kotlin. Ang Groovy ay tahasang naging hindi kawili-wili (may oras na lumipat sila sa mga grooves, ngunit mabilis itong lumipas).
  3. Bersyon ng tagsibol... Dito kailangan mong maunawaan na ang mga bersyon ng pangunahing bahagi ng Spring at ang mga module nito ay pare-pareho.
  4. Data ng proyekto. Inilarawan ko na ang mga bagay na ito.
  5. Pinipili namin kung aling archive ang kokolektahin - Jar o Digmaan.
  6. Well, ang bersyon ng Java ng aming paborito. At kamakailan lamang ay nagkaroon ng maraming mga bersyon na ito... Naghintay sila ng maraming taon, at ngayon ay mayroon nang dalawa sa isang taon.
Sa aming kaso, ipa-publish namin ang proyektong ito sa organisasyon ng JavaRush Community , kaya ang impormasyon tungkol sa proyekto ay magiging angkop:
  1. Maven - hindi para sa wala ang pag-uusap namin sa iyo tungkol dito kanina.
  2. Si Java ang ating sinta :D
  3. Kunin natin ang bersyon 2.2.11. Bakit hindi ang pinakabago? Dahil mas bago ito, mas malaki ang posibilidad na may ilang mga bug doon. Para sa amin, hindi mahalaga kung aling bersyon, ngunit ang mas matanda ay magiging mas maaasahan. Samakatuwid, pipiliin namin ang 2.2.11.
  4. Pangkat: com.github.javarushcommunity
  5. Artifact: springboot-flyway-demo
  6. Pangalan: SpringBoot + Flyway Demo
  7. Paglalarawan: Ipinapakita ng proyekto ang pagsasama sa pagitan ng SpringBoot at Flyway . (Oo, ang kakayahang magsulat ng dokumentasyon ay isang mahalagang bahagi ng pag-unlad :))
  8. Pangalan ng package: com.github.javarushcommunity.springbootflywaydemo . Dito ay agad silang gagawa ng isang pangunahing pakete para sa amin na may isang klase na maglulunsad ng aming aplikasyon.
  9. Packaging: Jar
  10. Java: 8. Huwag nating unahan ang lokomotibo at kunin ang magandang lumang walo. Bakit hindi 11? Para saan? Para sa aming halimbawa, hindi ko nakikita ang punto.
"Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 3Ngayon idagdag natin ang mga module. Kailangan nating maghanap ng pagsasama sa Flyway. Maaari ka ring magdagdag ng isang bagay na nauugnay sa MySQL at Spring Data. Magdagdag tayo ng isa pang lombok (ito ay isang bagay na napakahalaga, magtiwala lamang sa akin sa ngayon :D)) Upang gawin ito, mag-click sa ADD DEPENDENCY ... at piliin ang lahat ng kailangan mo: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 4Ito ay kung paano namin idagdag ang Flyway. "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 5Lombok... At iba pa. Bilang resulta, nakukuha namin ang: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 6Huh... pinunan namin ang lahat)) Ngayon i-click ang GENERATE... at iyon na - handa na ang archive na may nabuong proyekto :) Mayroon ding isang cool na bagay tulad ng SHARE... , na nagbibigay sa iyo ng link sa page na kakapuno mo lang. Ibig sabihin, narito ang nabuo ko . At kahit na may mali, maaari mong palaging suriin gamit ang link. Susunod, kailangan naming i-link ang ginawang proyekto sa Git repository, kaya i-clone namin ang nilikhang springboot-flyway-demo project at i-download ito sa pamamagitan ng IDEA. Upang gawin ito, kailangan mong buksan ang ideya at piliin ang File -> Bago -> Proyekto mula sa Mga Umiiral na Pinagmulan... : "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 7Ngayon idagdag ang URL at i-click ang I-clone . Ang susunod na hakbang ay ilipat ang mga internal ng nabuong proyekto sa loob ng na-clone namin. nalilito? Ipapakita ko sa iyo ngayon. Binuksan ko ito at natanggap ang sumusunod na hanay ng mga file: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 8Kailangang ilipat ang mga ito sa naka-clone na proyekto. Tulad ng sa nakaraang artikulo, idagdag natin ang pom.xml bilang isang maven project: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 9Ngayon kami ay interesado sa pagtingin sa kung ano ang nabuo para sa amin. Kung bubuksan mo ang lahat ng mga folder sa src at higit pa, makikita mo ang karaniwang hierarchy sa mga proyekto ng Maven, na tinalakay namin sa nakaraang artikulo . Sa mga hindi pa nakakabasa nito, basahin niyo na! "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 10Makikita na mayroon kaming klase ng Application, at ang aming SpringBoot application ay ilulunsad gamit ito. Salamat sa Maven plugin para sa SpringBoot, mayroon na kaming gawain na kailangan namin para sa Maven, katulad ng spring-boot:run. Saan natin mahahanap ang impormasyong ito? Sa kanan, binubuksan ang Maven plate at ang aming proyekto: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 11Magkakaroon ng error, at hindi namin ito mababasa, makakakita kami ng ganito: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 12Upang makakuha ng karagdagang impormasyon, para sa bilis maaari naming patakbuhin ang pangunahing paraan ng ang klase ng Application: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 13At pagkatapos ay makikita natin ang tunay na dahilan: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 14Narito na Mayroong higit pang impormasyon at maaari kang gumawa ng isang bagay dito. anong mali? Mayroon kaming mga dependency na nauugnay sa database, at samakatuwid kailangan naming magbigay ng mga setting para sa pagkonekta dito. Para magawa ito, nag-google kami at nalaman namin na kailangan naming idagdag ang mga sumusunod na configuration sa 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
Pinapatakbo namin muli ang pangunahing paraan at makuha ang: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 15Ngayon kailangan naming magdagdag ng kahit isang paglipat. Upang gumawa ng migration nang tama, kailangan mong kunin ang sumusunod na template: V<VERSION>__<NAME>.sql Gamit ang template na ito, gagawa kami ng migration file na pinangalanang V00001__Create_country_table.sql sa naaangkop na folder: /src/main/resources/ db.migration/ . Gumawa tayo ng country table sa loob nito. Kunin natin ang script mula sa pangalawang artikulo tungkol sa database . "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 16Bago magsimula, pumasok tayo at gumawa ng database para sa trabaho: flyway_demo_db. Gawin natin ito sa pamamagitan ng MysqlWorkbench: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 17Ngayon ay maaari nating patakbuhin muli ang pangunahing pamamaraan: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 18Lahat ay gumana, ngunit dahil wala pa tayong anumang bagay sa proyekto, natapos na itong gumana. Gayunpaman, malinaw mula sa mga log ( basahin kung ano ang mga log ) na:
  1. Matagumpay na nakakonekta sa database.
  2. Na-validate na ang migration at okay na ang lahat.
  3. Gumawa ng talahanayan ang Flyway para pamahalaan ang mga paglilipat.
  4. At kung anong migration 00001 ang nagsimula - ang paglikha ng bansa ay matagumpay.
Upang suriin ito, maaari kang pumunta at tingnan kung ano ang ginagawa sa database. Kaya't pumunta tayo sa aming MySQL server at tingnan kung ano ang nangyayari sa mga talahanayan sa database ng flyway_demo_db: $ USE flyway_demo_db; $IPAKITA ANG MGA TABLE; "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 19Gaya ng inaasahan ko, may naganap na paglipat, kung saan ginawa ang talahanayan ng bansa at lumitaw ang talahanayan ng flyway_schema_history, na nag-iimbak ng impormasyon sa mga paglilipat. Pumunta pa tayo at tingnan kung anong mga tala ang mayroon (at kung mayroon man). $SELECT * MULA sa flyway_schema_history; "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 20Eto yung recording, isa lang. Naglalaman ito ng maraming kawili-wiling data. Bersyon, paglalarawan ng paglilipat, anong uri ng SQL (at maaaring XML din), ang pangalan ng script mismo, checksum ( ito ay parang hashcode, na ginagamit upang suriin kung nagbago ang paglipat o hindi. Ginagawa ito kung sakaling nagsagawa kami ng paglipat sa database at pagkatapos ay naitama ito: hindi ito magagawa, ang lahat ng mga pagbabago ay ginawa lamang sa pamamagitan ng isang bagong paglipat at upang maiwasang mangyari ito, sinusubaybayan ito ng halaga ng tseke ), pangalan ng sql ng gumagamit, pagproseso ng paglipat petsa, oras ng pagpapatupad at resulta (matagumpay o hindi matagumpay) . Ang isang migration na isinulat nang isang beses ay hindi dapat baguhin sa hinaharap. Kahit na may depekto ito. Ang lahat ng mga pagbabago ay nagaganap lamang sa pamamagitan ng isang bagong paglipat. Napakahalaga nito. Upang ipakita kung ano ang mangyayari, baguhin natin ang ating script at subukang patakbuhin itong muli. Magdagdag tayo ng isang entry sa talahanayan ng bansa sa ating paglipat: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 21at patakbuhin ang pangunahing pamamaraan at ito ang makukuha natin: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 22Gaya ng inaasahan ko, nakilala ng flyway na binago ang script at hindi nagsagawa ng paglipat. Sa ilang mga kaso, maaaring talagang kinakailangan na magpatakbo ng na-update na paglipat, at upang malaktawan ito ng flyway, kailangan mong tanggalin ang entry sa talahanayan ng flyway_schema_history at pagkatapos ay patakbuhin ang na-update na paglipat. Hindi ito normal na pag-uugali at hindi dapat ganoon, ngunit kailangan mo ring malaman ang tungkol sa pamamaraang ito ng paglutas ng problema. Hinarap namin ang unang migration. Ngayon ay nais kong magdagdag ng isa pang paglipat, na may data tungkol sa mga bansa, tulad ng sa artikulo tungkol sa database: file V00002__Add_test_data_to_country.sql"Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 23 At patakbuhin natin muli ang pangunahing pamamaraan: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 24Mula sa mga log ay malinaw na bago magsimula ang paglipat, ang database ay sa bersyon 00001, kaya lahat ng paglilipat pagkatapos ng bersyong ito. Susunod, ang bersyon 00002 ay inilunsad at naging matagumpay. Suriin natin, o naniniwala ka na ba sa akin na tatlong tala sa bansa ang nasa database na?)) Susuriin ko, kaya patunay: "Proyekto ng Java mula A hanggang Z": SpringBoot + Flyway - 25Isang bagay na ganito. Kung patakbuhin mong muli ang proyekto, laktawan lang ng flyway ang mga paglilipat, dahil ganap na sumusunod ang database sa kinakailangang bersyon.

Konklusyon

Sa pagkakataong ito natutunan namin kung paano maunawaan at gumamit ng tool sa paglilipat ng database kasabay ng SpringBoot. Ang impormasyong ito ay kinakailangan upang maunawaan kung ano ang isang database version control tool, gamit ang Flyway bilang isang halimbawa. Mga kaibigan, ang source code ng proyektong ipinakita ko ay na-publish sa aming organisasyon sa Github . Kung gusto mo ang halimbawa, bigyan ito ng bituin , at mauunawaan ko na ang aking trabaho ay kapaki-pakinabang at talagang nagkakahalaga ng pagpapatuloy. Ayon sa kaugalian, iminumungkahi kong mag-subscribe sa aking Github account . Sa pamamagitan niya ay isinasagawa ko ang lahat ng aking trabaho sa open source at lahat ng mga proyektong demo na palaging kasama ng aking mga artikulo. Salamat sa lahat ng nagbabasa. Sa susunod na isusulat namin ang aming aplikasyon. Magkakaroon ng ilang kinakailangang teorya sa Docker sa hinaharap, ngunit lubos naming ibababa ito sa pagsasanay.

kapaki-pakinabang na mga link

Ngayon ay walang maraming kapaki-pakinabang na mga link. Bigyang-pansin ang video ni Evgeniy, ito ay talagang sulit!
  1. Website para sa paglikha ng mga proyekto sa Spring
  2. Evgeniy Borisov - Tagabuo ng tagsibol
  3. Dokumentasyon sa Spring para sa Flyway

Ang isang listahan ng lahat ng mga materyales sa serye ay nasa simula ng artikulong ito.

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