Menggunakan Liquibase untuk mengelola struktur database dalam aplikasi Spring Boot. Bagian 1

Dalam artikel ini, saya akan membahas penggunaan utilitas Liquibase dalam aplikasi Boot Spring untuk versi struktur database relasional dan memigrasikan struktur ini dari satu versi ke versi lain. Pada bagian pertama, kita akan menganalisis contoh dasar, dan pada bagian kedua kita akan berbicara tentang menggunakan liquibase-mave-plugin untuk mengembalikan perubahan dan secara otomatis menghasilkan skrip dengan membandingkan struktur basis data.

Mari kita mulai dengan membuat aplikasi paling sederhana di Spring Boot + JPA (Hibernate). Spring Initializr akan membantu kami dengan ini. Dari dependensi, pilih JPA, MySQL, dan Web. Liquibase juga dapat dihubungkan pada langkah ini, tetapi untuk pemahaman yang lebih baik kita akan melakukannya nanti secara manual.

Buat dasar aplikasi


Kami menambahkan kelas entitas ke aplikasi kami, serta repositori dan pengontrol REST untuk bekerja dengannya. Untuk konkret, kami akan menyimpan informasi tentang pengguna di entitas yang dibuat.

@Entity @Table(name = "users") public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "username", unique = true, nullable = false) private String userName; @Column(name = "password", nullable = false) private String password; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "email") private String email; //    ,    //    Lombok } 

Spring Data membuat kode repositori sangat ringkas

 public interface UserRepository extends JpaRepository<User, Long> { } 

Kontroler REST yang akan menampilkan seluruh isi tabel pengguna

 @RestController public class UserController { private UserRepository userRepository; @Autowired public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping("/user/all") public List<User> allUsers() { return userRepository.findAll(); } } 

Pengaturan dalam file application.properties

 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/geek_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=dbuser spring.datasource.password=dbpassword spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 

Diasumsikan bahwa komputer Anda menjalankan server MySQL pada port standar. Jika perlu, sesuaikan URL server dalam string koneksi, serta nama pengguna dan kata sandi. Perlu juga memperhatikan parameter createDatabaseIfNotExist . Berkat itu, saat terhubung, kami akan membuat database bernama geek_db jika tidak ada di server.

Tambahkan Liquibase


Tentunya Anda memperhatikan bahwa satu pengaturan untuk Hibernate tidak ada , yaitu spring.jpa.hibernate.ddl-auto . Di sebagian besar manual pemula, nilai pembaruan ditunjukkan untuk itu, karena Hibernate akan membuat dan menyesuaikan struktur tabel di server itu sendiri, berdasarkan kelas entitas yang ada dalam proyek. Pendekatan ini dapat digunakan jika skema data sangat sederhana atau proyek adalah pelatihan, tetapi dengan skema yang agak rumit, masalah kemungkinan besar akan dimulai, jika hanya karena kita tidak dapat mengontrol proses pembuatan skrip DDL Hibernasi. Masalah lain adalah bahwa dengan pendekatan ini tidak ada cara mudah untuk mengembalikan perubahan yang dibuat ke Hibernate dalam struktur database.

Untuk menyelesaikan masalah di atas kita akan menggunakan utilitas Liquibase . Untungnya bagi kami, ia dapat dengan sempurna diintegrasikan dengan aplikasi Spring Boot! Untuk mulai menggunakannya, Anda harus melakukan langkah-langkah berikut

Tambahkan pengaturan ke file application.properties

 spring.jpa.hibernate.ddl-auto=none 

Ini untuk memastikan bahwa Hibernate tidak melakukan tindakan apa pun untuk memodifikasi sirkuit, seperti Liquibase akan melakukannya sekarang. Secara teoritis, di sini Anda juga dapat menggunakan nilai validasi untuk kontrol tambahan atas kebenaran struktur tabel.

Tambahkan dependensi ke pom.xml

 <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> 

Setelah menambahkannya, boot Spring akan secara otomatis membuat kacang khusus bernama liquibase, yang akan melakukan semua tindakan untuk mengkonfigurasi skema database berdasarkan skrip Liquibase setiap kali aplikasi dimulai.

Sekarang Anda perlu menambahkan skrip Liquibase itu sendiri, yang akan membuat tabel yang kita butuhkan. Di folder / src / main / resources / db / changelog, buat file bernama db.changelog-master.yaml dan tambahkan konten berikut ke dalamnya

 databaseChangeLog: - logicalFilePath: db/changelog/db.changelog-lesson1.yaml - changeSet: id: 1 author: your_liquibase_username changes: - createTable: tableName: users columns: - column: name: id type: BIGINT autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: varchar(50) constraints: unique: true nullable: false - column: name: password type: varchar(512) constraints: nullable: false - column: name: first_name type: varchar(50) - column: name: last_name type: varchar(50) - column: name: email type: varchar(50) 

Mari kita menganalisis isi skrip ini. Pertama-tama, ini berisi satu set perubahan. ChangeSet adalah analog dari komit dalam sistem kontrol versi seperti Git atau SVN. Dengan analogi dengan komit, perubahan yang dibuat sebagai bagian dari satu changeSet dapat digulirkan atau digulirkan kembali ke server database. Setiap changeSet harus memiliki pengidentifikasi unik yang Liquibase menentukan apakah perubahanSet yang diberikan telah dipompa ke database ini atau tidak.

ChangeSet berisi perintah untuk membuat tabel, dan struktur tabel dijelaskan oleh Liquibase, dan bukan skrip SQL. Berkat ini, file ini menjadi cross-platform. Liquibase akan menghasilkan skrip SQL tergantung pada server database yang digunakan. Selain itu, jika kita perlu mengembalikan setset yang diberikan, Liquibase akan dapat secara otomatis membuat skrip untuk menghapus tabel yang diberikan. Jika kita menggunakan skrip SQL, maka kita harus menulis skrip secara manual untuk mengembalikan perubahan. Di bagian hanges , kami hanya memiliki satu tim dan ini dianggap praktik yang baik, meskipun faktanya ada sejumlah tim dalam satu perubahan .

Kode tertulis sudah cukup untuk menjalankan program, tetapi untuk lebih jelas melihat hasil kerjanya, mari kita tambahkan setset lain, yang akan mengisi tabel dengan data.

  - changeSet: id: 2 author: your_liquibase_username comment: "Create admin user" changes: - insert: tableName: users columns: - column: name: username value: "admin" - column: name: password value: "admin" - column: name: email value: "admin@server.com" - insert: tableName: users columns: - column: name: username value: "guest" - column: name: password value: "guest" - column: name: email value: "guest@server.com" rollback: - delete: tableName: users where: username in ('admin', 'guest') 

Dalam hal ini, kami harus menulis blok untuk operasi rollback secara manual, sebagai Liquibase tidak dapat secara otomatis membuat rollback SQL saat bekerja dengan data. Secara umum, bekerja dengan data dalam basis data tidak termasuk fitur utama Liquibase dan hanya terbatas pada operasi yang paling sederhana yaitu memasukkan, menghapus, atau mengubah. Omong-omong, jika Anda membutuhkan lebih banyak, maka di sini Anda dapat menggunakan alat dari perusahaan Red Gate .

Jadi, mari kita jalankan aplikasi kita dan mencoba mengikuti tautan http: // localhost: 8080 / user / all . Jika aplikasi dimulai, maka Anda akan melihat respons JSON dengan informasi tentang dua pengguna yang ditambahkan ke tabel. Penting juga melihat log peluncuran aplikasi, di mana Anda dapat melihat skrip yang dijalankan Liquibase untuk menginisialisasi basis data. Perhatian khusus harus diberikan pada tabel DATABASECHANGELOG . Di dalamnya Liquibase menyimpan log perubahan yang dibuat ke database.

Itu saja untuk saat ini. Setelah beberapa waktu, saya berencana untuk menerbitkan kelanjutan tentang penggunaan liquibase-maven-plugin untuk secara otomatis menghasilkan skrip dengan membandingkan struktur database dan mengembalikan perubahan yang dibuat.

Saya akan berterima kasih atas penambahan dan komentar!

PS Kode lengkap ditulis berdasarkan artikel ini github.com/usharik/spring-liquibase-demo/tree/part-1

Dilanjutkan di habr.com/en/post/460907

Source: https://habr.com/ru/post/id460377/


All Articles