บทความจากซีรีส์เกี่ยวกับการสร้างโปรเจ็กต์ Java (ลิงก์ไปยังเนื้อหาอื่นอยู่ท้ายสุด) เป้าหมายคือการวิเคราะห์เทคโนโลยีที่สำคัญ ผลลัพธ์คือการเขียนบอทโทรเลข ในส่วนนี้เราจะลองเปิดตัว SpringBoot และ Flyway จำนวนทฤษฎีขั้นต่ำตามที่คุณต้องการ))) เราละเว้นการเปรียบเทียบขั้นสุดท้ายของ Flyway/Liquibase เป็นระยะเวลาไม่มีกำหนดและไปยังจุดนั้น และถึงอย่างนั้นมันก็ลากต่อไปแล้ว เพื่อไม่ให้อธิบาย Flyway ซ้ำสองครั้ง ฉันจึงตัดสินใจเพิ่มสิ่งนี้ลงในโครงการ JRTB ในอนาคตของเราทันที
หลายแง่มุมหลายโมดูลาร์:
ที่นี่คุณจะต้องกรอกและเลือกสิ่งที่คุณต้องการ:
ตอนนี้เรามาเพิ่มโมดูลกัน เราจำเป็นต้องค้นหาการบูรณาการกับ Flyway คุณยังสามารถเพิ่มบางอย่างที่เกี่ยวข้องกับ MySQL และ Spring Data ได้ มาเพิ่มอีกลอมบอก (นี่เป็นสิ่งที่จำเป็นมาก ตอนนี้เชื่อฉันเถอะ :D)) โดยคลิกที่ADD DEPENDENCIES ... และเลือกทุกสิ่งที่คุณต้องการ:
นี่คือวิธีที่เราเพิ่ม Flyway
ลอมบอก... และอื่นๆ เป็นผลให้เราได้รับ:
ฮะ... เรากรอกทุกอย่างแล้ว)) ตอนนี้คลิกสร้าง...เพียงเท่านี้ - ไฟล์เก็บถาวรที่มีโปรเจ็กต์ที่สร้างขึ้นก็พร้อมแล้ว :) ยังมีสิ่งที่ยอดเยี่ยมเช่นSHARE... , ซึ่งให้ลิงค์ไปยังหน้าที่คุณเพิ่งกรอก นั่นคือนี่คือสิ่งที่ฉันสร้างขึ้น และแม้ว่าจะมีข้อผิดพลาดเกิดขึ้น คุณก็สามารถตรวจสอบได้โดยใช้ลิงก์เสมอ ต่อไป เราต้องเชื่อมโยงโปรเจ็กต์ที่สร้างขึ้นกับที่เก็บ Git ดังนั้นเราจึงโคลน โปรเจ็กต์springboot-flyway-demo ที่สร้างขึ้น และดาวน์โหลดผ่าน IDEA ในการดำเนินการ นี้คุณจะต้องเปิดแนวคิดและเลือกFile -> New -> Project from Existing Sources... :
เพิ่ม URL แล้วคลิกClone ขั้นตอนต่อไปคือการถ่ายโอนข้อมูลภายในของโปรเจ็กต์ที่สร้างขึ้นภายในโปรเจ็กต์ที่เราโคลน สับสน? ฉันจะแสดงให้คุณดูตอนนี้ ฉันแตกไฟล์แล้วได้รับไฟล์ชุดต่อไปนี้:
จำเป็นต้องโอนไฟล์เหล่านี้ไปยังโปรเจ็กต์ที่โคลน เช่นเดียวกับในบทความที่แล้ว มาเพิ่ม pom.xml เป็นโปรเจ็กต์ maven กัน
ตอนนี้เราสนใจที่จะดูว่าอะไรถูกสร้างขึ้นสำหรับเรา หากคุณเปิดโฟลเดอร์ทั้งหมดใน src และต่อไป คุณจะเห็นลำดับชั้นตามปกติในโครงการ Maven ซึ่งเราได้กล่าวถึงในบทความก่อนหน้านี้ ส่วนใครที่ยังไม่ได้อ่านก็อ่านได้เลย!
จะเห็นได้ว่าเรามีคลาส Application และแอปพลิเคชัน SpringBoot ของเราก็จะถูกเรียกใช้งานด้วย ต้องขอบคุณปลั๊กอิน Maven สำหรับ SpringBoot ตอนนี้เรามีงานที่เราต้องการสำหรับ Maven ซึ่งก็คือ spring-boot:run เราจะหาข้อมูลนี้ได้ที่ไหน? ทางด้านขวามือเปิดแผ่น Maven และโปรเจ็กต์ของเรา:
จะมีข้อผิดพลาดและเราอ่านไม่ออกเราจะเห็นสิ่งนี้:
หากต้องการข้อมูลเพิ่มเติม เพื่อความรวดเร็วเราสามารถเรียกใช้เมธอดหลักของ คลาส Application:
แล้วเราจะเห็นเหตุผลที่แท้จริง:
ที่นี่มีข้อมูลเพิ่มเติมแล้วและคุณสามารถทำอะไรกับมันได้ เกิดอะไรขึ้น? เรามีการขึ้นต่อกันที่เกี่ยวข้องกับฐานข้อมูล ดังนั้นเราจึงจำเป็นต้องจัดเตรียมการตั้งค่าสำหรับการเชื่อมต่อกับฐานข้อมูล ในการดำเนินการนี้ เราค้นหาใน Google และพบว่าเราต้องเพิ่มการกำหนดค่าต่อไปนี้ให้กับ application.properties:
ตอนนี้เราต้องเพิ่มการโยกย้ายอย่างน้อยหนึ่งครั้ง หากต้องการเขียนการโยกย้ายอย่างถูกต้อง คุณจะต้องใช้เทมเพลตต่อไปนี้: V<VERSION>__<NAME>.sql เราจะสร้างไฟล์การโยกย้ายชื่อV00001__Create_country_table.sqlลงในโฟลเดอร์ที่เหมาะสม: /src/main/resources/ db.migration/ . มาสร้างตารางประเทศในนั้นกันเถอะ ลองใช้สคริปต์จากบทความที่สองเกี่ยวกับฐานข้อมูล
ก่อนที่จะเริ่ม เรามาเข้าไปสร้างฐานข้อมูลสำหรับงานกันก่อน: flyway_demo_db มาทำสิ่งนี้ผ่าน MysqlWorkbench กัน:
ตอนนี้เราสามารถรันเมธอดหลักได้อีกครั้ง:
ทุกอย่างเรียบร้อยดี แต่เนื่องจากเราไม่มีอะไรในโปรเจ็กต์เลย มันจึงทำงานเสร็จแล้ว อย่างไรก็ตาม จากบันทึกเป็นที่ชัดเจนว่า ( อ่านว่าบันทึกคืออะไร) ว่า:
ตามที่ฉันคาดไว้ การโยกย้ายเกิดขึ้นในระหว่างที่มีการสร้างตารางประเทศและตาราง flyway_schema_history ปรากฏขึ้น ซึ่งเก็บข้อมูลเกี่ยวกับการโยกย้าย มาดูกันต่อว่ามีบันทึกใดบ้าง (และมีบันทึกทั้งหมดหรือไม่) $SELECT * จาก flyway_schema_history;
นี่คือบันทึกเดียวเท่านั้น มันมีข้อมูลที่น่าสนใจมากมาย เวอร์ชัน, คำอธิบายของการโยกย้าย, ประเภทของ SQL (และอาจเป็น XML), ชื่อของสคริปต์เอง, เช็คซัม ( นี่คือสิ่งที่คล้ายกับแฮชโค้ดซึ่งใช้ในการตรวจสอบว่าการโยกย้ายมีการเปลี่ยนแปลงหรือไม่ เท่านี้ก็เป็นอันเสร็จสิ้น ในกรณีที่เราดำเนินการย้ายข้อมูลในฐานข้อมูลแล้วได้รับการแก้ไข: สิ่งนี้ไม่สามารถทำได้ การเปลี่ยนแปลงทั้งหมดจะทำผ่านการย้ายใหม่เท่านั้น และเพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น จำนวนเช็คจะตรวจสอบสิ่งนี้ ) ชื่อ sql ของผู้ใช้ การประมวลผลการย้าย วันที่ เวลาดำเนินการ และผลลัพธ์ (สำเร็จหรือไม่สำเร็จ) การโยกย้ายที่เขียนเพียงครั้งเดียวไม่ควรเปลี่ยนแปลงในอนาคต แม้ว่าจะมีข้อบกพร่องอยู่ก็ตาม การเปลี่ยนแปลงทั้งหมดจะเกิดขึ้นผ่านการโยกย้ายใหม่เท่านั้น มันสำคัญมาก. เพื่อแสดงให้เห็นว่าจะเกิดอะไรขึ้น มาเปลี่ยนสคริปต์ของเราเล็กน้อยแล้วลองรันอีกครั้ง มาเพิ่มหนึ่งรายการในตารางประเทศในการโยกย้ายของเรา:
และเรียกใช้วิธีการหลักและนี่คือสิ่งที่เราได้รับ:
ตามที่ฉันคาดไว้ flyway รับรู้ว่าสคริปต์มีการเปลี่ยนแปลงและไม่ได้ดำเนินการโยกย้าย ในบางกรณี อาจจำเป็นต้องเรียกใช้การย้ายข้อมูลที่อัปเดต และเพื่อให้ flyway ข้ามสิ่งนี้ไปได้ คุณจะต้องลบรายการในตาราง flyway_schema_history แล้วจึงเรียกใช้การย้ายที่อัปเดต นี่ไม่ใช่พฤติกรรมปกติและไม่ควรเป็นเช่นนั้น แต่คุณจำเป็นต้องรู้เกี่ยวกับวิธีการแก้ไขปัญหานี้ด้วย เราจัดการกับการโยกย้ายครั้งแรก ตอนนี้ฉันต้องการเพิ่มการโยกย้ายอีกครั้งพร้อมข้อมูลเกี่ยวกับประเทศเช่นเดียวกับในบทความเกี่ยวกับฐานข้อมูล: ไฟล์V00002__Add_test_data_to_country.sql
และมาเรียกใช้วิธีการหลักอีกครั้ง:
จากบันทึกเป็นที่ชัดเจนว่าก่อนที่การโยกย้ายจะเริ่มต้นฐานข้อมูลนั้นถูก ในเวอร์ชัน 00001 ดังนั้นการย้ายข้อมูลทั้งหมดหลังจากเวอร์ชันนี้ ถัดไป เวอร์ชัน 00002 ได้เปิดตัวและประสบความสำเร็จ มาตรวจสอบกันหรือคุณเชื่อฉันแล้วว่าบันทึกสามรายการในประเทศจะอยู่ในฐานข้อมูลแล้ว?)) ฉันจะตรวจสอบ เพื่อเป็นข้อพิสูจน์:
บางอย่างเช่นนี้ หากคุณรันโปรเจ็กต์อีกครั้ง flyway จะข้ามขั้นตอนการย้ายข้อมูลออกไป เนื่องจากฐานข้อมูลสอดคล้องกับเวอร์ชันที่ต้องการโดยสมบูรณ์
เราต้องทำอะไรเพื่อเป็นส่วนหนึ่งของสิ่งนี้?
- เปิดแอปพลิเคชัน SpringBoot โดยใช้ Maven
- เพิ่ม Flyway เข้าไปที่นั่น: โชคดีที่สามารถรวมเข้าด้วยกันได้อย่างง่ายดาย
- เพิ่มสคีมาสำหรับตารางที่เรามีในฐานข้อมูลตัวอย่าง
ฟลายเวย์คืออะไร
หากต้องการใช้สิ่งใดสิ่งหนึ่ง คุณต้องเข้าใจก่อนว่ามันคืออะไรและเพราะเหตุใด Flywayเป็นเครื่องมือควบคุมเวอร์ชันฐานข้อมูล คำศัพท์ก็รู้ดีแต่ยังไม่เสริมความเข้าใจใช่ไหม? เรามาลองอธิบายปัญหาที่ทางบินแก้ไขกันดีกว่า สมมุติว่าเรามีโครงการ เช่นเดียวกับทุกสิ่งในโลกของเรา มันไม่สมบูรณ์แบบ ดังนั้นจึงไม่สามารถวางแผนและร่างเวอร์ชันสุดท้ายของโครงการได้ ทุกครั้งที่มีความแตกต่างบางอย่างที่ไม่ทราบสาเหตุปรากฏขึ้น โครงการใช้ฐานข้อมูลในการทำงาน แน่นอนว่าหากโครงการเปลี่ยนแปลง โครงสร้างฐานข้อมูลก็อาจเปลี่ยนแปลงไปด้วย สมมติว่าเราเพิ่มฟิลด์ใหม่สำหรับหนึ่งในเอนทิตีในโครงการของเรา ทำอย่างไร?- เพิ่มฟิลด์นี้ให้กับเอนทิตีของเรา อัปเดตทุกอย่างเพื่อให้ตรรกะทางธุรกิจทำงานได้
- อัพเดตฐานข้อมูล วิธีเดียวที่เป็นไปได้คือทำด้วยตนเอง ในการดำเนินการนี้ คุณจะต้องเข้าไปลงทะเบียนสคริปต์ sql ที่จำเป็น
- แต่หากเรามีสถานที่มากกว่าหนึ่งแห่งที่เราปรับใช้โปรเจ็กต์ของเรา จำเป็นต้องดำเนินการนี้ในแต่ละแห่งหรือไม่?
- และหากเราอยากย้อนกลับไป เราจะรู้ได้อย่างไรว่าตอนนี้โครงสร้างฐานข้อมูลอยู่ในสถานะไหน?
- เราจะแน่ใจได้อย่างไรว่าการเปลี่ยนแปลงฐานข้อมูลสำเร็จ?
- ฉันจะได้รับโอกาสในการติดตามการเปลี่ยนแปลงฐานข้อมูลทั้งหมดที่เกิดขึ้นในโครงการได้อย่างไร
เปิดตัว SpringBoot + Flyway
Spring Boot คืออะไร
เรากำลังเปิดตัวอะไร... เพื่อให้เข้าใจว่าเรากำลังทำอะไรและทำไม คุณต้องตัดสินใจว่า SpringBoot คืออะไร ก่อนอื่น มาพูดถึงSpring กันก่อน (ก็เร็วมาก) กัน ก่อน ในขณะนี้ ถือเป็นมาตรฐานอุตสาหกรรมโดยพฤตินัยในการพัฒนาแอปพลิเคชันเซิร์ฟเวอร์ใน Java มาตรฐานของอะไร? ฉันจะอธิบายเรื่องนี้ให้คุณได้อย่างไร? Spring เป็นโครงกระดูกของแอปพลิเคชัน ซึ่งเราจะโยน "เนื้อ" ซึ่งเป็นตรรกะทางธุรกิจของเราลงไป ด้วยความช่วยเหลือของ Spring (ต่อไปนี้ฉันจะใช้กระดาษลอกลายนี้เพื่อไม่ให้เสียเวลาในการเปลี่ยนภาษา :D)) Spring ทำให้เราเริ่มต้นจากการที่เราเริ่มทำทุกอย่าง มี- คุณต้องการทำงานกับฐานข้อมูลหรือไม่? คุณต้องการความสัมพันธ์ไหม? คุณต้องการไม่สัมพันธ์กันหรือไม่? เราอยู่ที่นี่กับ Spring Data
- คุณต้องการทำงานกับคำขอ http หรือไม่? เอาล่ะ Spring web (Spring MVC)
- คุณต้องการคอนเทนเนอร์สำหรับสิ่งของทั้งหมดของคุณในที่เดียวหรือไม่? นี่คือสปริงคอร์
- คุณจำเป็นต้องตั้งค่าความปลอดภัยในโปรเจ็กต์เพื่อให้มีบทบาทและสายการบังคับบัญชาที่แตกต่างกันหรือไม่? ความปลอดภัยของสปริง
- เมื่อคุณคิดว่ามันคงจะดีถ้ามีสิ่งนั้น ปรากฎว่า Spring มีสิ่งที่คุณต้องการอยู่แล้ว และบูรณาการได้อย่างรวดเร็วและง่ายดาย
เปิดตัว SpringBoot
เนื่องจากเราเข้าใจแล้วว่า Maven คืออะไร เรามาสร้างโปรเจ็กต์ใหม่ตามความต้องการของเรากันดีกว่า ในการดำเนินการนี้คุณเพียงแค่ต้องไปที่เว็บไซต์ที่สร้างขึ้นเป็นพิเศษสำหรับเรื่องนี้ มันเรียกว่าSpring Initializr
- เครื่องมือสร้างโปรเจ็กต์เป็นแบบ gradle หรือ maven อย่างที่คุณเห็น Ant ไม่ได้ถูกกล่าวถึงอีกต่อไป นี่เป็นคำแนะนำที่ดีว่าเครื่องมือสร้างใดที่คุ้มค่ากับเวลาของคุณ
- ภาษาที่คุณเขียนได้คือ java, kotlin, groovy ทุกอย่างเรียบง่ายที่นี่: ทั้งหมดเหมือน JVM และรันโค้ด Java ได้อย่างง่ายดาย อย่างไรก็ตามมันก็คุ้มค่าที่จะดู Kotlin Groovy ไม่น่าสนใจเลย (มีช่วงหนึ่งที่พวกเขาเปลี่ยนมาใช้กรูฟ แต่มันก็ผ่านไปอย่างรวดเร็ว)
- เวอร์ชัน Spring... ที่นี่คุณต้องเข้าใจว่าเวอร์ชันของส่วนหลักของ Spring และโมดูลนั้นสอดคล้องกัน
- ข้อมูลโครงการ ฉันได้อธิบายสิ่งเหล่านี้แล้ว
- เราเลือกว่าจะรวบรวมไฟล์เก็บถาวรใด - Jar หรือ War
- เวอร์ชัน Java ที่เราชื่นชอบ และล่าสุดก็มีเวอร์ชั่นเหล่านี้ออกมาเยอะมาก... รอมาหลายปีแล้ว ตอนนี้มีปีละสองปีแล้ว
- Maven - ไม่ใช่เพื่ออะไรเลยที่เราคุยกับคุณเกี่ยวกับเรื่องนี้ก่อนหน้านี้
- Java คือที่รักของเรา :D
- มาใช้เวอร์ชัน 2.2.11 กันเถอะ ทำไมไม่ใหม่ล่าสุดล่ะ? เพราะยิ่งใหม่ก็ยิ่งมีโอกาสที่อาจมีจุดบกพร่องมากขึ้นเท่านั้น สำหรับเรามันไม่สำคัญว่าจะเป็นเวอร์ชั่นไหน แต่รุ่นเก่าจะเชื่อถือได้มากกว่า ดังนั้นเราจึงเลือก 2.2.11
- กลุ่ม: com.github.javarushcommunity
- สิ่งประดิษฐ์: springboot-flyway-demo
- ชื่อ: SpringBoot + Flyway Demo
- คำอธิบาย: โครงการสาธิตการบูรณาการระหว่าง SpringBoot และ Flyway (ใช่แล้ว ความสามารถในการเขียนเอกสารเป็นส่วนสำคัญของการพัฒนา :))
- ชื่อแพ็คเกจ: com.github.javarushcommunity.springbootflywaydemo ที่นี่พวกเขาจะสร้างแพ็คเกจพื้นฐานให้เราทันทีด้วยคลาสที่จะเปิดตัวแอปพลิเคชันของเรา
- บรรจุภัณฑ์: โถ
- ชวา: 8. อย่าไปข้างหน้าหัวรถจักรและเอาแปดคนเก่าที่ดีไปดีกว่า ทำไมไม่ 11? เพื่ออะไร? สำหรับตัวอย่างของเรา ฉันไม่เห็นประเด็นนี้












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
เราเรียกใช้เมธอดหลักอีกครั้งและได้รับ: 



- เชื่อมต่อกับฐานข้อมูลสำเร็จ
- การย้ายข้อมูลได้รับการตรวจสอบแล้วและทุกอย่างเรียบร้อยดี
- Flyway ได้สร้างตารางเพื่อจัดการการโยกย้าย
- และสิ่งที่การอพยพ 00001 เริ่มต้นขึ้น - การสร้างประเทศประสบความสำเร็จ







บทสรุป
ครั้งนี้เราได้เรียนรู้วิธีทำความเข้าใจและใช้เครื่องมือย้ายฐานข้อมูลร่วมกับ SpringBoot ข้อมูลนี้จำเป็นต่อการทำความเข้าใจว่าเครื่องมือควบคุมเวอร์ชันฐานข้อมูลคืออะไร โดยใช้ Flyway เป็นตัวอย่าง เพื่อน ๆ ซอร์สโค้ดของโครงการที่ฉันแสดงนั้นเผยแพร่ในองค์กรของเราบน Github ถ้าคุณชอบตัวอย่างนี้ให้ดาวเลยแล้วฉันจะเข้าใจว่างานของฉันมีประโยชน์และคุ้มค่าที่จะทำต่อจริงๆ ตามเนื้อผ้า ฉันแนะนำให้สมัครบัญชี Github ของฉัน ฉันดำเนินงานทั้งหมดของฉันเกี่ยวกับโอเพ่นซอร์สและโครงการสาธิตทั้งหมดที่มาพร้อมกับบทความของฉันผ่านทางเขา ขอบคุณทุกคนที่อ่าน ครั้งต่อไปเราจะเขียนใบสมัครของเรา จะมีทฤษฎีที่จำเป็นบางอย่างเกี่ยวกับ Docker ในอนาคต แต่เราจะเจือจางมันลงอย่างมากด้วยการฝึกฝนลิงค์ที่เป็นประโยชน์
วันนี้มีลิงค์ที่มีประโยชน์ไม่มาก ดูวิดีโอของ Evgeniy สิ คุ้มจริงๆ!- เว็บไซต์สำหรับสร้างโครงการใน Spring
- Evgeniy Borisov - ผู้สร้างสปริง
- เอกสารประกอบใน Spring สำหรับ Flyway
GO TO FULL VERSION