SpringBoot整合Liquibase實(shí)現(xiàn)對數(shù)據(jù)庫管理和遷移
簡介
Liquibase是一個用于用于跟蹤、管理和應(yīng)用數(shù)據(jù)庫變化的開源工具,通過日志文件(changelog)的形式記錄數(shù)據(jù)庫的變更(changeset),然后執(zhí)行日志文件中的修改,將數(shù)據(jù)庫更新或回滾(rollback)到一致的狀態(tài)。它的目標(biāo)是提供一種數(shù)據(jù)庫類型無關(guān)的解決方案,通過執(zhí)行schema類型的文件來達(dá)到遷移。本文主要介紹SpringBoot與Liquibase的集成。
優(yōu)點(diǎn)
- 支持幾乎所有主流的數(shù)據(jù)庫,目前支持包括 Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL等 各種數(shù)據(jù)庫,這樣在數(shù)據(jù)庫的部署和升級環(huán)節(jié)可幫助應(yīng)用系統(tǒng)支持多數(shù)據(jù)庫;
- 支持版本控制,這樣就能支持多開發(fā)者的協(xié)作維護(hù);
- 日志文件支持多種格式,如XML, YAML, JSON, SQL等;
- 提供變化應(yīng)用的回滾功能,可按時間、數(shù)量或標(biāo)簽(tag)回滾已應(yīng)用的變化。通過這種方式,開發(fā)人員可輕易的還原數(shù)據(jù)庫在任何時間點(diǎn)的狀態(tài);
- 支持多種運(yùn)行方式,如命令行、Spring集成、Maven插件、Gradle插件等。
簡單示例
這里主要介紹基于SpringBoot集成liquibase來管理數(shù)據(jù)庫的變更。
POM依賴
Maven 包的依賴,主要包含mysql驅(qū)動, 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)包含了對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,不過依然推薦使用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)
測試
啟動springBootApplication, 我們可以看到如下的幾個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ù)庫,你會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)變更
那我們?nèi)绻匦聠舆@個SpringBootApplication,會怎么呢?
很顯然,因?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í)踐 簡單而言: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)對數(shù)據(jù)庫管理和遷移的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Liquibase數(shù)據(jù)庫管理和遷移的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java web監(jiān)聽器統(tǒng)計(jì)在線用戶及人數(shù)
本文主要介紹了java web監(jiān)聽器統(tǒng)計(jì)在線用戶及人數(shù)的方法解析。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡單封裝
這篇文章主要介紹了淺談使用java實(shí)現(xiàn)阿里云消息隊(duì)列簡單封裝,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例
這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例,一般來說DSA算法用于簽名的效率會比RSA要快,需要的朋友可以參考下2016-04-04Springboot Maven打包跳過測試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過測試的五種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)
這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java中Optional.of()方法及源碼解析(非常詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個實(shí)例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單的方法
這篇文章主要介紹了Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單,包括實(shí)體類中添加子菜單列表和集合及構(gòu)建菜單樹的詳細(xì)代碼,代碼簡單易懂,需要的朋友可以參考下2021-12-12