一、項(xiàng)目背景
本文主要是配合SpringBoot使用用戶輸入的自定義數(shù)據(jù)源啟動(dòng)一文附帶產(chǎn)出。前文主要介紹了SpringBoot無(wú)數(shù)據(jù)源啟動(dòng),然后通過(guò)用戶錄入自定義數(shù)據(jù)庫(kù)配置后,連接數(shù)據(jù)庫(kù)的操作。但是當(dāng)整個(gè)項(xiàng)目交給用戶使用時(shí),誰(shuí)使用都不知道情況下,數(shù)據(jù)源都自己定義的情況下,我們項(xiàng)目升級(jí)版本,免不了有數(shù)據(jù)庫(kù)文件變更的情況,這個(gè)時(shí)候,就靠本文介紹的flyway
來(lái)控制數(shù)據(jù)庫(kù)版本了。
Flyway是一款開(kāi)源的數(shù)據(jù)庫(kù)版本管理工具,可以實(shí)現(xiàn)管理并跟蹤數(shù)據(jù)庫(kù)變更,支持?jǐn)?shù)據(jù)庫(kù)版本自動(dòng)升級(jí),而且不需要復(fù)雜的配置,能夠幫助團(tuán)隊(duì)更加方便、合理的管理數(shù)據(jù)庫(kù)變更。
例:創(chuàng)建兩個(gè)sql變更文件,項(xiàng)目啟動(dòng)后會(huì)將兩個(gè)文件中的sql語(yǔ)句全部執(zhí)行。
二、涉及到技術(shù)棧
本文演示涉及到大技術(shù)如下:
- Spring Boot version: 2.7.12
- Mysql version: 8.0.29
- Mybatis-plus version: 3.3.2
- flywaydb version: 5.2.1
demo中引入的依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.maple</groupId>
<artifactId>maple-flyway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maple-flyway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入web相關(guān) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--使用Mysql數(shù)據(jù)庫(kù)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.1</version>
</dependency>
<!-- mybatis-plus的依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--Lombok管理Getter/Setter/log等-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.18.24</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三、功能實(shí)現(xiàn)
本文只是為了演示實(shí)現(xiàn)思想,源碼只是一個(gè)實(shí)現(xiàn)的小demo,具體使用還是需要結(jié)合自己項(xiàng)目。
實(shí)現(xiàn)思想
直接在java工程中嵌入sql腳本。工程重新部署時(shí),會(huì)自動(dòng)更新數(shù)據(jù)庫(kù),保證數(shù)據(jù)庫(kù)與代碼同步,避免了手動(dòng)更新數(shù)據(jù)庫(kù)帶來(lái)的弊病。
flywaydb:主要是再第一次啟動(dòng)的時(shí)候創(chuàng)建flyway_schema_history表,然后去加載classpath下的文件進(jìn)行執(zhí)行,并且再表中記錄加載的版本號(hào)記錄。
具體代碼
首先創(chuàng)建一個(gè)SpringBoot項(xiàng)目,這里就不展開(kāi)贅述
添加我們的yml配置文件
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/maple?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 123456
# flyway配置
flyway:
# 是否啟用flyway
enabled: true
# 編碼格式,默認(rèn)UTF-8
encoding: UTF-8
# 遷移sql腳本文件存放路徑,官方默認(rèn)db/migration
locations: classpath:db/migration
# 遷移sql腳本文件名稱的前綴,默認(rèn)V
sql-migration-prefix: V
# 遷移sql腳本文件名稱的分隔符,默認(rèn)2個(gè)下劃線__
sql-migration-separator: __
# 遷移sql腳本文件名稱的后綴
sql-migration-suffixes: .sql
# 遷移時(shí)是否進(jìn)行校驗(yàn),默認(rèn)true
validate-on-migrate: true
# 當(dāng)遷移發(fā)現(xiàn)數(shù)據(jù)庫(kù)非空且存在沒(méi)有元數(shù)據(jù)的表時(shí),自動(dòng)執(zhí)行基準(zhǔn)遷移,新建schema_version表
baseline-on-migrate: true
# 是否關(guān)閉要清除已有庫(kù)下的表功能,生產(chǎn)環(huán)境必須為true,否則會(huì)刪庫(kù)
clean-disabled: true
具體的配置規(guī)則我們會(huì)在后面講到
在resources目錄下創(chuàng)建我們存放sql的目錄db/migration
,這個(gè)是官方默認(rèn)的路徑,我們可以自己進(jìn)行修改調(diào)整
創(chuàng)建sql文件V20230328_01__user.sql
CREATE TABLE `maple_user`
(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_name` VARCHAR(64) NOT NULL COMMENT '登錄賬號(hào)',
`password` VARCHAR(64) NOT NULL COMMENT '登錄密碼',
PRIMARY KEY (`id`) USING BTREE
) COMMENT='用戶信息' COLLATE='utf8_general_ci' ENGINE=InnoDB;
此時(shí),整個(gè)配置就完成了,如下圖所示
四、系統(tǒng)測(cè)試
接下來(lái),我們對(duì)系統(tǒng)進(jìn)行一下測(cè)試,直接啟動(dòng)項(xiàng)目即可.
接下來(lái),我們?nèi)タ匆幌挛覀兊臄?shù)據(jù)庫(kù),可以看到生成的表,其中flyway_schema_history
是flyway自動(dòng)生成的表,用于標(biāo)記sql是否執(zhí)行了,執(zhí)行結(jié)果等信息,maple_user
是我們需要生成的業(yè)務(wù)表
到這里本文就結(jié)束了。
五、flyway配置講解
sql腳本命名規(guī)則
- 僅需要執(zhí)行一次的,以大寫(xiě)“V”開(kāi)頭,V+版本后(版本號(hào)間的數(shù)字以“.” 或者“ _ ”分隔開(kāi),“ _ ”會(huì)自動(dòng)編譯
成“ . ” )+" __"+文件描述+后綴名
- 需要執(zhí)行多次的,以大寫(xiě)“R”開(kāi)頭,命名如R__clean.sql ,R的腳本只要改變了就會(huì)執(zhí)行,R不帶版本號(hào)
- V開(kāi)頭的比R開(kāi)頭的優(yōu)先級(jí)要高。
前綴:用于版本控制(可配置)、撤消(可配置)和可重復(fù)遷移(可配置)VUR)
版本:帶有點(diǎn)或下劃線的版本可根據(jù)需要分隔任意數(shù)量的部分(不適用于可重復(fù)的遷移)
分隔符:(兩個(gè)下劃線)(可配置)__)
說(shuō)明:下劃線或空格分隔單詞
后綴:(可配置.sql)
(可選)版本控制 SQL 遷移還可以省略分隔符和說(shuō)明
flyway配置詳解
flyway.baseline-description對(duì)執(zhí)行遷移時(shí)基準(zhǔn)版本的描述.
flyway.baseline-on-migrate當(dāng)遷移時(shí)發(fā)現(xiàn)目標(biāo)schema非空,而且?guī)в袥](méi)有元數(shù)據(jù)的表時(shí),是否自動(dòng)執(zhí)
行基準(zhǔn)遷移,默認(rèn)false.
flyway.baseline-version開(kāi)始執(zhí)行基準(zhǔn)遷移時(shí)對(duì)現(xiàn)有的schema的版本打標(biāo)簽,默認(rèn)值為1.
flyway.check-location檢查遷移腳本的位置是否存在,默認(rèn)false.
flyway.clean-on-validation-error當(dāng)發(fā)現(xiàn)校驗(yàn)錯(cuò)誤時(shí)是否自動(dòng)調(diào)用clean,默認(rèn)false.
flyway.enabled是否開(kāi)啟flywary,默認(rèn)true.
flyway.encoding設(shè)置遷移時(shí)的編碼,默認(rèn)UTF-8.
flyway.ignore-failed-future-migration當(dāng)讀取元數(shù)據(jù)表時(shí)是否忽略錯(cuò)誤的遷移,默認(rèn)false.
flyway.init-sqls當(dāng)初始化好連接時(shí)要執(zhí)行的SQL.
flyway.locations遷移腳本的位置,默認(rèn)db/migration.
flyway.out-of-order是否允許無(wú)序的遷移,默認(rèn)false.
flyway.password目標(biāo)數(shù)據(jù)庫(kù)的密碼.
flyway.placeholder-prefix設(shè)置每個(gè)placeholder的前綴,默認(rèn)${.
flyway.placeholder-replacementplaceholders是否要被替換,默認(rèn)true.
flyway.placeholder-suffix設(shè)置每個(gè)placeholder的后綴,默認(rèn)}.
flyway.placeholders.[placeholder name]設(shè)置placeholder的value
flyway.schemas設(shè)定需要flywary遷移的schema,大小寫(xiě)敏感,默認(rèn)為連接默認(rèn)的schema.
flyway.sql-migration-prefix遷移文件的前綴,默認(rèn)為V.
flyway.sql-migration-separator遷移腳本的文件名分隔符,默認(rèn)__
flyway.sql-migration-suffix遷移腳本的后綴,默認(rèn)為.sql
flyway.tableflyway使用的元數(shù)據(jù)表名,默認(rèn)為schema_version
flyway.target遷移時(shí)使用的目標(biāo)版本,默認(rèn)為latest version
flyway.url遷移時(shí)使用的JDBC URL,如果沒(méi)有指定的話,將使用配置的主數(shù)據(jù)源
flyway.user遷移數(shù)據(jù)庫(kù)的用戶名
flyway.validate-on-migrate遷移時(shí)是否校驗(yàn),默認(rèn)為true
六、項(xiàng)目源碼
本文到此就結(jié)束了,如果幫助到你了,幫忙點(diǎn)個(gè)贊??
本文源碼:https://github.com/hack-feng/maple-product/tree/main/maple-flyway
SpringBoot使用用戶輸入的自定義數(shù)據(jù)源啟動(dòng)【附源碼】文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-468302.html
我是笑小楓,全網(wǎng)皆可搜的【笑小楓】文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-468302.html
到了這里,關(guān)于SpringBoot使用flywaydb實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本管理【附源碼】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!