SpringBoot整合Liquibase實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)管理和遷移
簡(jiǎn)介
Liquibase是一個(gè)用于用于跟蹤、管理和應(yīng)用數(shù)據(jù)庫(kù)變化的開(kāi)源工具,通過(guò)日志文件(changelog)的形式記錄數(shù)據(jù)庫(kù)的變更(changeset),然后執(zhí)行日志文件中的修改,將數(shù)據(jù)庫(kù)更新或回滾(rollback)到一致的狀態(tài)。它的目標(biāo)是提供一種數(shù)據(jù)庫(kù)類(lèi)型無(wú)關(guān)的解決方案,通過(guò)執(zhí)行schema類(lèi)型的文件來(lái)達(dá)到遷移。本文主要介紹SpringBoot與Liquibase的集成。
優(yōu)點(diǎn)
- 支持幾乎所有主流的數(shù)據(jù)庫(kù),目前支持包括 Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL等 各種數(shù)據(jù)庫(kù),這樣在數(shù)據(jù)庫(kù)的部署和升級(jí)環(huán)節(jié)可幫助應(yīng)用系統(tǒng)支持多數(shù)據(jù)庫(kù);
- 支持版本控制,這樣就能支持多開(kāi)發(fā)者的協(xié)作維護(hù);
- 日志文件支持多種格式,如XML, YAML, JSON, SQL等;
- 提供變化應(yīng)用的回滾功能,可按時(shí)間、數(shù)量或標(biāo)簽(tag)回滾已應(yīng)用的變化。通過(guò)這種方式,開(kāi)發(fā)人員可輕易的還原數(shù)據(jù)庫(kù)在任何時(shí)間點(diǎn)的狀態(tài);
- 支持多種運(yùn)行方式,如命令行、Spring集成、Maven插件、Gradle插件等。
簡(jiǎn)單示例
這里主要介紹基于SpringBoot集成liquibase來(lái)管理數(shù)據(jù)庫(kù)的變更。
POM依賴(lài)
Maven 包的依賴(lài),主要包含mysql驅(qū)動(dòng), JDBC(這里spring-boot-starter-data-jpa包含了jdbc包,當(dāng)然直接引入jdbc包也行),以及l(fā)iquibase包。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>com.github.wenhao</groupId> <artifactId>jpa-spec</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.9.1</version> </dependency>
yml配置
SpringBoot AutoConfig默認(rèn)已經(jīng)包含了對(duì)liquibase的配置,在spring.liquibase配置下。
基礎(chǔ)的配置,可以直接使用如下(主要是指定change-log的位置,默認(rèn)的位置是classpath:/db/changelog/db.changelog-master.yaml):
spring: datasource: url: jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8 driver-class-name: com.mysql.cj.jdbc.Driver username: root password: bfXa4Pt2lUUScy8jakXf liquibase: enabled: true # 如下配置是被spring.datasource賦值的,所以可以不配置 # url: jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8 # user: root # password: bfXa4Pt2lUUScy8jakXf change-log: classpath:/db/changelog/db.changelog-master.yaml
新增changelog
XML方式固然OK,不過(guò)依然推薦使用yml格式。
databaseChangeLog: - changeSet: id: 20220412-01 author: pdai changes: - createTable: tableName: person columns: - column: name: id type: int autoIncrement: true constraints: primaryKey: true nullable: false - column: name: firstname type: varchar(50) - column: name: lastname type: varchar(50) constraints: nullable: false - column: name: state type: char(2) - changeSet: id: 20220412-02 author: pdai changes: - addColumn: tableName: person columns: - column: name: username type: varchar(8) - changeSet: id: 20220412-03 author: pdai changes: - addLookupTable: existingTableName: person existingColumnName: state newTableName: state newColumnName: id newColumnDataType: char(2)
測(cè)試
啟動(dòng)springBootApplication, 我們可以看到如下的幾個(gè)changeSet被依次執(zhí)行
2022-04-12 20:41:20.591 INFO 8476 --- [ main] liquibase.lockservice : Successfully acquired change log lock 2022-04-12 20:41:20.737 INFO 8476 --- [ main] liquibase.changelog : Creating database history table with name: test_db_liquibase.DATABASECHANGELOG 2022-04-12 20:41:20.783 INFO 8476 --- [ main] liquibase.changelog : Reading from test_db_liquibase.DATABASECHANGELOG Running Changeset: classpath:/db/changelog/db.changelog-master.yaml::20220412-01::pdai 2022-04-12 20:41:20.914 INFO 8476 --- [ main] liquibase.changelog : Table person created 2022-04-12 20:41:20.914 INFO 8476 --- [ main] liquibase.changelog : ChangeSet classpath:/db/changelog/db.changelog-master.yaml::20220412-01::pdai ran successfully in 53ms Running Changeset: classpath:/db/changelog/db.changelog-master.yaml::20220412-02::pdai 2022-04-12 20:41:20.952 INFO 8476 --- [ main] liquibase.changelog : Columns username(varchar(8)) added to person 2022-04-12 20:41:20.952 INFO 8476 --- [ main] liquibase.changelog : ChangeSet classpath:/db/changelog/db.changelog-master.yaml::20220412-02::pdai ran successfully in 31ms Running Changeset: classpath:/db/changelog/db.changelog-master.yaml::20220412-03::pdai 2022-04-12 20:41:21.351 INFO 8476 --- [ main] liquibase.changelog : Lookup table added for person.state 2022-04-12 20:41:21.351 INFO 8476 --- [ main] liquibase.changelog : ChangeSet classpath:/db/changelog/db.changelog-master.yaml::20220412-03::pdai ran successfully in 389ms 2022-04-12 20:41:21.382 INFO 8476 --- [ main] liquibase.lockservice : Successfully released change log lock
查看數(shù)據(jù)庫(kù),你會(huì)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)變更
那我們?nèi)绻匦聠?dòng)這個(gè)SpringBootApplication,會(huì)怎么呢?
很顯然,因?yàn)閐atabasechangelog表中已經(jīng)有相關(guān)執(zhí)行記錄了,所以將不再執(zhí)行變更
2022-04-12 20:49:01.566 INFO 9144 --- [ main] liquibase.lockservice : Successfully acquired change log lock 2022-04-12 20:49:01.761 INFO 9144 --- [ main] liquibase.changelog : Reading from test_db_liquibase.DATABASECHANGELOG 2022-04-12 20:49:01.812 INFO 9144 --- [ main] liquibase.lockservice : Successfully released change log lock ## 進(jìn)一步理解 ### 比較好的changelog的實(shí)踐 簡(jiǎn)單而言:yml格式 + sql-file方式 執(zhí)行sqlFile格式的changeSet,如下  執(zhí)行的日志如下 ```log 2022-04-12 21:00:28.198 INFO 17540 --- [ main] liquibase.lockservice : Successfully acquired change log lock 2022-04-12 21:00:28.398 INFO 17540 --- [ main] liquibase.changelog : Reading from test_db_liquibase.DATABASECHANGELOG Running Changeset: classpath:/db/changelog/db.changelog-master.yaml::20220412-04::pdai 2022-04-12 21:00:28.516 INFO 17540 --- [ main] liquibase.changelog : SQL in file classpath:/db/changelog/db.changelog-20220412-04.sql executed 2022-04-12 21:00:28.516 INFO 17540 --- [ main] liquibase.changelog : ChangeSet classpath:/db/changelog/db.changelog-master.yaml::20220412-04::pdai ran successfully in 83ms 2022-04-12 21:00:28.532 INFO 17540 --- [ main] liquibase.lockservice : Successfully released change log lock
執(zhí)行后,查看變更記錄
數(shù)據(jù)表user表已經(jīng)創(chuàng)建并插入一條數(shù)據(jù)
以上就是SpringBoot整合Liquibase實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)管理和遷移的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Liquibase數(shù)據(jù)庫(kù)管理和遷移的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java web監(jiān)聽(tīng)器統(tǒng)計(jì)在線用戶(hù)及人數(shù)
本文主要介紹了java web監(jiān)聽(tīng)器統(tǒng)計(jì)在線用戶(hù)及人數(shù)的方法解析。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝
這篇文章主要介紹了淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡(jiǎn)單封裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例
這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例,一般來(lái)說(shuō)DSA算法用于簽名的效率會(huì)比RSA要快,需要的朋友可以參考下2016-04-04Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢(xún)
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢(xún),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)
這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java中Optional.of()方法及源碼解析(非常詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類(lèi)的of()方法用于獲得該Optional類(lèi)中具有指定類(lèi)型的指定值的一個(gè)實(shí)例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹(shù)狀菜單的方法
這篇文章主要介紹了Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹(shù)狀菜單,包括實(shí)體類(lèi)中添加子菜單列表和集合及構(gòu)建菜單樹(shù)的詳細(xì)代碼,代碼簡(jiǎn)單易懂,需要的朋友可以參考下2021-12-12