JavaRush /Blog Java /Random-VI /SpringBoot + Flyway - "Dự án Java từ A đến Z"
Roman Beekeeper
Mức độ

SpringBoot + Flyway - "Dự án Java từ A đến Z"

Xuất bản trong nhóm
Một bài viết trong loạt bài viết về cách tạo một dự án Java (có liên kết đến các tài liệu khác ở cuối). Mục tiêu của nó là phân tích các công nghệ chủ chốt, kết quả là viết một bot điện tín. Trong phần này, chúng tôi thử khởi chạy SpringBoot và Flyway. Lượng lý thuyết tối thiểu, tùy thích))) Chúng tôi bỏ qua phần so sánh cuối cùng về Flyway/Liquibase trong một khoảng thời gian không xác định và đi vào vấn đề. Và thậm chí như vậy nó đã kéo dài. Để không mô tả Flyway hai lần, tôi quyết định thêm nó ngay vào dự án JRTB trong tương lai của chúng tôi."Dự án Java từ A đến Z": SpringBoot + Flyway - 1

Chúng ta cần phải làm gì khi tham gia vào việc này?

  1. Khởi chạy ứng dụng SpringBoot dựa trên Maven.
  2. Thêm Flyway vào đó: may mắn thay, chúng dễ dàng được tích hợp.
  3. Thêm lược đồ cho các bảng mà chúng ta có trong cơ sở dữ liệu mẫu.
Bằng cách này, chúng ta sẽ học cách làm việc với Flyway. Tại sao lại là một dự án riêng biệt mà không đưa ngay vào JRTB của chúng tôi? Bởi vì sau này, bất cứ ai muốn hiểu cách thực hiện việc này sẽ có một dự án kèm theo một ví dụ và một bài viết mô tả cách làm việc với nó. Nào đi thôi!

Đường bay là gì

Để sử dụng một cái gì đó, trước tiên bạn cần phải tìm ra nó là gì và tại sao. Flyway là một công cụ kiểm soát phiên bản cơ sở dữ liệu. Lời thì ai cũng biết nhưng không hiểu sao vẫn chưa thêm vào được phải không? Hãy thử mô tả vấn đề mà đường bay giải quyết được. Giả sử chúng ta có một dự án. Giống như mọi thứ trên thế giới của chúng ta, nó không hoàn hảo nên không thể lập kế hoạch và đưa ra phiên bản cuối cùng của dự án. Mỗi khi một số sắc thái không được tính toán xuất hiện. Dự án sử dụng cơ sở dữ liệu trong công việc của mình. Tất nhiên, nếu dự án thay đổi thì cấu trúc cơ sở dữ liệu cũng có thể thay đổi. Giả sử chúng ta thêm một trường mới cho một trong các thực thể trong dự án của mình. Làm thế nào để làm nó?
  1. Thêm trường này vào thực thể của chúng tôi, cập nhật mọi thứ để logic nghiệp vụ hoạt động.
  2. Cập nhật cơ sở dữ liệu. Cách duy nhất có thể là làm điều đó bằng tay. Để làm điều này, bạn cần vào và đăng ký tập lệnh sql cần thiết.
Điểm thứ hai đặt ra nhiều câu hỏi:
  1. Nhưng nếu chúng tôi có nhiều nơi để triển khai dự án của mình thì việc này có cần phải thực hiện ở mỗi nơi không?
  2. và nếu muốn quay lại, làm cách nào để biết chính xác cấu trúc cơ sở dữ liệu hiện đang ở trạng thái nào?
  3. Làm thế nào chúng tôi có thể chắc chắn rằng việc thay đổi cơ sở dữ liệu đã thành công?
  4. Làm cách nào tôi có thể có cơ hội theo dõi tất cả các thay đổi cơ sở dữ liệu diễn ra trong dự án?
Nếu bạn làm thủ công, câu trả lời sẽ không phải là tốt nhất... Để tránh tất cả những khó khăn này, bạn có thể sử dụng công cụ di chuyển cơ sở dữ liệu. Một trong số đó là Đường bay. Anh ấy làm nghề gì? Là một phần của dự án, chúng tôi lưu trữ các tệp sql riêng biệt (được gọi là di chuyển), lưu trữ mọi thứ chúng tôi thực hiện với cơ sở dữ liệu cùng một lúc. Tất cả các quá trình di chuyển diễn ra nghiêm ngặt theo một thứ tự nhất định, cho phép bạn theo dõi các thay đổi trong cấu trúc và dữ liệu của cơ sở dữ liệu (thông thường, khi sử dụng di chuyển, dữ liệu thử nghiệm sẽ được thêm vào dự án để khi nó được triển khai đến một số máy chủ, nó đã có một số các giá trị mà bạn có thể kiểm tra dự án). Sau khi vượt qua các bài kiểm tra, quá trình di chuyển sẽ được khởi chạy khi dự án được xây dựng. Họ kết nối với cơ sở dữ liệu và thực hiện di chuyển. Nếu quá trình di chuyển đã được thực hiện trên cơ sở dữ liệu này thì đường bay sẽ chỉ bỏ qua chúng (nó lưu trữ dữ liệu về quá trình di chuyển và trạng thái của chúng trong một bảng riêng trong cơ sở dữ liệu, giúp quản lý chúng) và nếu một số quá trình di chuyển không thành công thì dự án sẽ build và quá trình gắn (triển khai) của nó vào máy chủ sẽ dừng lại. Tôi đã cố gắng mô tả nó càng chi tiết càng tốt. Nếu mọi thứ vẫn chưa hoàn toàn rõ ràng thì cũng không thành vấn đề: nhờ thực hành, sự hiểu biết sẽ đến.

Khởi chạy SpringBoot + Flyway

Khởi động mùa xuân là gì

Chúng tôi đang tung ra cái gì?... Để hiểu những gì và tại sao chúng tôi đang làm, bạn cần quyết định SpringBoot là gì. Đầu tiên, hãy nhanh chóng (à, rất nhanh) nói về Spring . Hiện tại, trên thực tế, đây là tiêu chuẩn công nghiệp trong việc phát triển các ứng dụng máy chủ bằng Java. Tiêu chuẩn của cái gì? Làm sao tôi có thể giải thích điều này với bạn? Spring là bộ xương của ứng dụng, sau đó chúng tôi đưa “thịt” - logic kinh doanh của chúng tôi vào đó. Với sự trợ giúp của Spring (sau đây tôi sẽ sử dụng giấy can này để không mất thời gian chuyển đổi ngôn ngữ :D)) Spring cho chúng ta một khởi đầu để từ đó chúng ta bắt đầu làm mọi việc. Nó có nhiều mặt, đa mô-đun:
  1. Bạn có muốn làm việc với cơ sở dữ liệu không? Bạn có muốn quan hệ? Bạn có muốn không quan hệ? Chúng ta đang ở đây với Spring Data.
  2. Bạn có muốn làm việc với các yêu cầu http không? Của bạn đây, Spring web (Spring MVC).
  3. Bạn có cần một thùng chứa cho tất cả đồ vật của mình ở một nơi không? Đây là Spring Core.
  4. Bạn có cần thiết lập bảo mật cho một dự án để có các vai trò và chuỗi lệnh khác nhau không? An ninh mùa xuân.
  5. Ngay khi bạn nghĩ có một thứ như vậy thì thật tuyệt, hóa ra Spring đã có sẵn thứ bạn cần, và nó tích hợp nhanh chóng, dễ dàng.
Vì vậy, có thể nói rằng đây không chỉ là một framework (một thư viện khổng lồ) mà là cả một hệ sinh thái đang phát triển với tốc độ chóng mặt. Để hiểu Spring Core là gì, tức là nền tảng mà các mô-đun được kết nối, tôi khuyên bạn nên xem bản demo trực tiếp về cách tạo khung của riêng bạn. Nó được tổ chức bởi Evgeny Borisov, một anh chàng rất ngầu trong lĩnh vực Java và Spring. Hãy làm mọi việc anh ấy đã làm, và công việc của mùa xuân sẽ trở nên rõ ràng hơn với bạn. Ngược lại, SpringBoot là đỉnh cao của mọi thứ họ có. Sự kỳ diệu của nước tinh khiết. Cài đặt tối thiểu để thực hiện lần khởi chạy ứng dụng đầu tiên. Tất nhiên, điều này sẽ không giúp bạn hiểu cách sử dụng nó và những việc cần làm. Nhưng trước khi lao vào chiều sâu phát triển, bạn cần nhìn mọi thứ từ góc nhìn của một con chim.

Khởi chạy SpringBoot

Vì chúng ta đã hiểu Maven là gì nên hãy tạo một dự án mới cho nhu cầu của chúng ta. Để làm điều này, bạn chỉ cần truy cập một trang web được tạo đặc biệt cho vấn đề này. Nó được gọi là Spring Khởi tạo . "Dự án Java từ A đến Z": SpringBoot + Flyway - 2Tại đây bạn cần điền và chọn những gì bạn cần:
  1. Công cụ xây dựng dự án là gradle hoặc maven. Như bạn có thể thấy, Ant thậm chí không còn được nhắc đến nữa. Đây là gợi ý hay về công cụ xây dựng nào đáng để bạn dành thời gian.
  2. Ngôn ngữ bạn có thể viết là java, kotlin, groovy. Mọi thứ ở đây đều đơn giản: chúng đều giống JVM và dễ chạy mã Java. Nhân tiện, thật đáng để xem xét Kotlin. Groovy thực sự đã trở nên không thú vị (đã có lúc họ chuyển sang theo rãnh, nhưng nó nhanh chóng trôi qua).
  3. Phiên bản mùa xuân... Ở đây bạn cần hiểu rằng các phiên bản của phần chính của Spring và các mô-đun của nó là nhất quán.
  4. Dữ liệu dự án. Tôi đã mô tả những điều này rồi.
  5. Chúng tôi chọn kho lưu trữ nào sẽ được thu thập - Jar hoặc War.
  6. Vâng, phiên bản Java yêu thích của chúng tôi. Và gần đây đã có rất nhiều phiên bản này... Họ đã chờ đợi nhiều năm, và bây giờ mỗi năm có hai phiên bản.
Trong trường hợp của chúng tôi, chúng tôi sẽ xuất bản dự án này trong tổ chức Cộng đồng JavaRush , vì vậy thông tin về dự án sẽ phù hợp:
  1. Maven - không phải vô ích mà chúng tôi đã nói chuyện với bạn về điều này trước đó.
  2. Java là con cưng của chúng tôi :D
  3. Hãy lấy phiên bản 2.2.11. Tại sao không phải là cái mới nhất? Bởi vì nó càng mới thì khả năng có một số lỗi ở đó càng lớn. Đối với chúng tôi, phiên bản nào không quan trọng, nhưng phiên bản cũ hơn sẽ đáng tin cậy hơn. Vì vậy chúng tôi chọn 2.2.11.
  4. Nhóm: com.github.javarushcommunity
  5. Hiện vật: springboot-flyway-demo
  6. Tên: SpringBoot + Flyway Demo
  7. Mô tả: Dự án thể hiện sự tích hợp giữa SpringBoot và Flyway . (Đúng, khả năng viết tài liệu là một phần quan trọng của quá trình phát triển :))
  8. Tên gói: com.github.javarushcommunity.springbootflywaydemo . Tại đây họ sẽ ngay lập tức tạo một gói cơ bản cho chúng ta với một lớp sẽ khởi chạy ứng dụng của chúng ta.
  9. Bao bì: Bình
  10. Java: 8. Chúng ta đừng đi trước đầu máy và lấy tám cái cũ tốt. Tại sao không phải là 11? Để làm gì? Đối với ví dụ của chúng tôi, tôi không hiểu vấn đề.
"Dự án Java từ A đến Z": SpringBoot + Flyway - 3Bây giờ hãy thêm các mô-đun. Chúng ta cần tìm sự tích hợp với Flyway. Bạn cũng có thể thêm nội dung nào đó liên quan đến MySQL và Spring Data. Hãy thêm một lombok khác (đây là điều rất cần thiết, tạm thời hãy tin tôi nhé :D)) Để thực hiện việc này, hãy nhấp vào THÊM PHỤ THUỘC ... và chọn mọi thứ bạn cần: "Dự án Java từ A đến Z": SpringBoot + Flyway - 4Đây là cách chúng tôi thêm Flyway. "Dự án Java từ A đến Z": SpringBoot + Flyway - 5Lombok... Và vân vân. Kết quả là, chúng tôi nhận được: "Dự án Java từ A đến Z": SpringBoot + Flyway - 6Huh... chúng tôi đã điền mọi thứ)) Bây giờ hãy nhấp vào TẠO... và thế là xong - kho lưu trữ với dự án được tạo đã sẵn sàng :) Ngoài ra còn có một điều thú vị như CHIA SẺ... , cung cấp cho bạn một liên kết đến trang mà bạn vừa điền. Đó là, đây là cái tôi đã tạo . Và ngay cả khi có sự cố xảy ra, bạn luôn có thể kiểm tra bằng liên kết. Tiếp theo, chúng ta cần liên kết dự án đã tạo với kho lưu trữ Git, vì vậy chúng ta sao chép dự án springboot-flyway-demo đã tạo và tải xuống qua IDEA. Để thực hiện việc này, bạn cần mở ý tưởng và chọn File -> New -> Project from Existing Sources... : "Dự án Java từ A đến Z": SpringBoot + Flyway - 7Bây giờ hãy thêm URL và nhấp vào Clone . Bước tiếp theo là chuyển nội bộ của dự án đã tạo vào bên trong dự án mà chúng tôi đã nhân bản. Bối rối? Tôi sẽ chỉ cho bạn bây giờ. Tôi đã giải nén nó và nhận được bộ tệp sau: "Dự án Java từ A đến Z": SpringBoot + Flyway - 8Những tệp này cần được chuyển sang dự án nhân bản. Như trong bài viết trước, hãy thêm pom.xml làm dự án maven: "Dự án Java từ A đến Z": SpringBoot + Flyway - 9Bây giờ chúng ta quan tâm đến việc xem những gì đã được tạo cho chúng ta. Nếu bạn mở tất cả các thư mục trong src trở lên, bạn sẽ thấy hệ thống phân cấp thông thường trong các dự án Maven mà chúng ta đã thảo luận trong bài viết trước . Ai chưa đọc thì đọc nhé! "Dự án Java từ A đến Z": SpringBoot + Flyway - 10Có thể thấy rằng chúng ta có một lớp Ứng dụng và ứng dụng SpringBoot của chúng ta sẽ được khởi chạy bằng lớp đó. Nhờ có Maven plugin cho SpringBoot, giờ đây chúng ta đã có nhiệm vụ cần thiết cho Maven, đó là spring-boot:run. Chúng ta có thể tìm thấy thông tin này ở đâu? Ở bên phải, mở tấm Maven và dự án của chúng tôi: "Dự án Java từ A đến Z": SpringBoot + Flyway - 11Sẽ có lỗi và chúng tôi sẽ không đọc được, chúng tôi sẽ thấy một cái gì đó như thế này: "Dự án Java từ A đến Z": SpringBoot + Flyway - 12Để biết thêm thông tin, để có tốc độ, chúng tôi có thể chạy phương thức chính của lớp Ứng dụng: "Dự án Java từ A đến Z": SpringBoot + Flyway - 13Và sau đó chúng ta sẽ thấy lý do thực sự: "Dự án Java từ A đến Z": SpringBoot + Flyway - 14Ở đây đã có nhiều thông tin hơn và bạn có thể làm gì đó với nó. Chuyện gì vậy? Chúng tôi có các phần phụ thuộc được liên kết với cơ sở dữ liệu và do đó chúng tôi cần cung cấp các cài đặt để kết nối với cơ sở dữ liệu đó. Để làm điều này, chúng tôi google và thấy rằng chúng tôi cần thêm các cấu hình sau vào 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
Chúng tôi chạy lại phương thức chính và nhận được: "Dự án Java từ A đến Z": SpringBoot + Flyway - 15Bây giờ chúng tôi cần thêm ít nhất một lần di chuyển. Để soạn thảo di chuyển một cách chính xác, bạn cần lấy mẫu sau: V<VERSION>__<NAME>.sql Sử dụng mẫu này, chúng tôi sẽ tạo một tệp di chuyển có tên V00001__Create_country_table.sql trong thư mục thích hợp: /src/main/resources/ db.migration/ . Hãy tạo một bảng quốc gia trong đó. Hãy lấy đoạn script từ bài viết thứ hai về cơ sở dữ liệu . "Dự án Java từ A đến Z": SpringBoot + Flyway - 16Trước khi bắt đầu, chúng ta hãy vào và tạo cơ sở dữ liệu cho công việc: flyway_demo_db. Hãy thực hiện việc này thông qua MysqlWorkbench: "Dự án Java từ A đến Z": SpringBoot + Flyway - 17Bây giờ chúng ta có thể chạy lại phương thức chính: "Dự án Java từ A đến Z": SpringBoot + Flyway - 18Mọi thứ đã ổn, nhưng vì chúng ta chưa có gì trong dự án nên nó đã hoạt động xong. Tuy nhiên, rõ ràng từ nhật ký ( đọc nhật ký là gì ) rằng:
  1. Đã kết nối thành công với cơ sở dữ liệu.
  2. Quá trình di chuyển đã được xác thực và mọi thứ đều ổn.
  3. Flyway đã tạo một bảng để quản lý việc di chuyển.
  4. Và cuộc di cư 00001 đã bắt đầu - việc thành lập đất nước đã thành công.
Để kiểm tra điều này, bạn có thể vào và xem những gì đang được thực hiện trong cơ sở dữ liệu. Vì vậy, hãy truy cập máy chủ MySQL của chúng tôi và xem điều gì đang xảy ra với các bảng trong cơ sở dữ liệu flyway_demo_db: $ USE flyway_demo_db; $HIỂN THỊ BẢNG; "Dự án Java từ A đến Z": SpringBoot + Flyway - 19Đúng như tôi mong đợi, quá trình di chuyển đã diễn ra, trong đó bảng quốc gia được tạo và bảng flyway_schema_history xuất hiện, bảng này lưu trữ thông tin về quá trình di chuyển. Chúng ta hãy đi xa hơn và xem có những bản ghi nào (và liệu có bản ghi nào không). $CHỌN * TỪ flyway_schema_history; "Dự án Java từ A đến Z": SpringBoot + Flyway - 20Đây là bản ghi âm, duy nhất. Nó chứa rất nhiều dữ liệu thú vị. Phiên bản, mô tả quá trình di chuyển, loại SQL (và có thể cả XML), tên của chính tập lệnh, tổng kiểm tra ( đây giống như mã băm, được sử dụng để kiểm tra xem quá trình di chuyển có thay đổi hay không. Việc này đã xong trong trường hợp chúng tôi thực hiện di chuyển trong cơ sở dữ liệu và sau đó nó đã được sửa: điều này không thể thực hiện được, tất cả các thay đổi chỉ được thực hiện thông qua một lần di chuyển mới và để ngăn điều này xảy ra, số lượng kiểm tra sẽ giám sát điều này ), tên sql của người dùng, xử lý di chuyển ngày, thời gian thực hiện và kết quả (thành công hay không thành công). Việc di chuyển được viết một lần sẽ không được thay đổi trong tương lai. Ngay cả khi có một khiếm khuyết trong đó. Tất cả các thay đổi chỉ diễn ra thông qua một lần di chuyển mới. Rất quan trọng. Để hiển thị điều gì sẽ xảy ra, hãy thay đổi tập lệnh của chúng ta một chút và thử chạy lại tập lệnh. Hãy thêm một mục vào bảng quốc gia trong quá trình di chuyển của chúng ta: "Dự án Java từ A đến Z": SpringBoot + Flyway - 21rồi chạy phương thức chính và đây là những gì chúng ta nhận được: Đúng "Dự án Java từ A đến Z": SpringBoot + Flyway - 22như tôi mong đợi, đường bay đã nhận ra rằng tập lệnh đã bị thay đổi và không thực hiện quá trình di chuyển. Trong một số trường hợp, thực tế có thể cần phải chạy quá trình di chuyển được cập nhật và để flyway bỏ qua việc này, bạn cần xóa mục nhập trong bảng flyway_schema_history rồi chạy quá trình di chuyển được cập nhật. Đây không phải là hành vi bình thường và không nên như vậy, nhưng bạn cũng cần biết về phương pháp giải quyết vấn đề này. Chúng tôi đã giải quyết cuộc di cư đầu tiên. Bây giờ tôi muốn thêm một lần di chuyển khác, với dữ liệu về các quốc gia, như trong bài viết về cơ sở dữ liệu: file V00002__Add_test_data_to_country.sql"Dự án Java từ A đến Z": SpringBoot + Flyway - 23 Và hãy chạy lại phương thức chính: "Dự án Java từ A đến Z": SpringBoot + Flyway - 24Từ nhật ký, rõ ràng là trước khi quá trình di chuyển bắt đầu, cơ sở dữ liệu đã được trong phiên bản 00001, vì vậy tất cả các lần di chuyển sau phiên bản này. Tiếp theo, phiên bản 00002 được ra mắt và thành công. Hãy kiểm tra xem, hay bạn đã tin tôi rằng ba hồ sơ trong nước sẽ có trong cơ sở dữ liệu?)) Tôi sẽ kiểm tra, vì vậy bằng chứng: "Dự án Java từ A đến Z": SpringBoot + Flyway - 25Đại loại như thế này. Nếu bạn chạy lại dự án, đường bay sẽ chỉ bỏ qua việc triển khai quá trình di chuyển vì cơ sở dữ liệu hoàn toàn tuân thủ phiên bản được yêu cầu.

Phần kết luận

Lần này chúng ta đã học cách hiểu và sử dụng công cụ di chuyển cơ sở dữ liệu kết hợp với SpringBoot. Thông tin này là cần thiết để hiểu công cụ kiểm soát phiên bản cơ sở dữ liệu là gì, sử dụng Flyway làm ví dụ. Các bạn ơi, mã nguồn của dự án mà tôi trình chiếu đã được xuất bản trong tổ chức của chúng tôi trên Github . Nếu bạn thích ví dụ này, hãy cho nó một ngôi sao và tôi sẽ hiểu rằng công việc của tôi rất hữu ích và thực sự đáng để tiếp tục. Theo truyền thống, tôi khuyên bạn nên đăng ký tài khoản Github của mình . Thông qua anh ấy, tôi thực hiện tất cả công việc của mình trên nguồn mở và tất cả các dự án demo luôn đi kèm với các bài viết của tôi. Cảm ơn mọi người đã đọc. Lần tới chúng tôi sẽ viết đơn đăng ký của mình. Sẽ có một số lý thuyết cần thiết về Docker trong tương lai, nhưng chúng tôi sẽ pha loãng nó với thực tiễn.

Liên kết hữu ích

Ngày nay không có nhiều liên kết hữu ích. Hãy chú ý đến video của Evgeniy, nó thực sự rất đáng giá!
  1. Trang web tạo dự án trên Spring
  2. Evgeniy Borisov - Người xây dựng mùa xuân
  3. Tài liệu về Spring for Flyway

Danh sách tất cả các tài liệu trong loạt bài này nằm ở đầu bài viết này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION