在項目中引入liquibase過程:
1、父項目 pom.xml 中添加依賴
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>3.5.5</version> </dependency> </dependencies>
2、添加liquibase.properties文件
#liquibase changeLogFile=src/main/resources/liquibase/db.changelog-master.xml driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 username=root password=egova
3、父項目 pom中添加liquibase插件
<build> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.5.1</version> <configuration> <!--properties文件路徑,該文件記錄了數據庫連接信息等--> <propertyFile>src/main/resources/liquibase.properties</propertyFile> <propertyFileWillOverride>true</propertyFileWillOverride> <!--生成文件的路徑--> <outputChangeLogFile>src/main/resources/liquibase/changelog_dev.xml</outputChangeLogFile> <!-- <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8</url> <username>root</username> <password>egova</password>--> </configuration> </plugin> </plugins> </build>
4、新建changelog主文件入口: db.changelog-master.xml
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <include file="src/main/resources/liquibase/changelog_dev.xml"/> <!-- <include file="com/example/db/changelog/db.changelog-1.1.xml"/> <include file="com/example/db/changelog/db.changelog-2.0.xml"/>--> </databaseChangeLog>
5、打開maven命令框:可以選擇模塊
6、生成changelog
liquibase:generateChangeLog
(1) 對當前數據庫狀態生成 changlog:
mvn liquibase:generateChangeLog
(2)只對數據生成 changelog ,(先用別的方式往數據庫創建數據后再用此方式生成changelog)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
區別:前者是在changelog中追加表創建語句,生成建表語句和數據插入語句,如果表語句已存在,則只生成建表語句:如圖

<?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> <changeSet author="zhaoyanhao" id="1565662890214-1" objectQuotingStrategy="QUOTE_ALL_OBJECTS"> <createTable tableName="test1"> <column name="id" type="BIGINT"> <constraints nullable="false"/> </column> <column name="name" type="VARCHAR(15)"> <constraints nullable="false"/> </column> <column name="email" type="VARCHAR(100)"> <constraints nullable="false"/> </column> <column name="password" type="VARCHAR(8)"> <constraints nullable="false"/> </column> <column name="phone" type="VARCHAR(50)"> <constraints nullable="false"/> </column> <column name="address" type="VARCHAR(255)"> <constraints nullable="false"/> </column> <column name="description" type="LONGTEXT"/> <column defaultValueComputed="CURRENT_TIMESTAMP" name="create_time" type="TIMESTAMP"> <constraints nullable="false"/> </column> </createTable> </changeSet> <changeSet author="zhaoyanhao" id="1565662890214-2" objectQuotingStrategy="QUOTE_ALL_OBJECTS"> <addPrimaryKey columnNames="id" constraintName="PRIMARY" tableName="test1"/> </changeSet> <changeSet author="zhaoyanhao" id="1565662890214-3" objectQuotingStrategy="QUOTE_ALL_OBJECTS"> <createTable tableName="test2"> <column name="id" type="BIGINT"> <constraints nullable="false"/> </column> <column name="name" type="VARCHAR(15)"> <constraints nullable="false"/> </column> <column name="password" type="VARCHAR(8)"> <constraints nullable="false"/> </column> <column name="phone" type="VARCHAR(50)"> <constraints nullable="false"/> </column> <column name="address" type="VARCHAR(255)"> <constraints nullable="false"/> </column> <column name="description" type="LONGTEXT"/> <column defaultValueComputed="CURRENT_TIMESTAMP" name="create_time" type="TIMESTAMP"> <constraints nullable="false"/> </column> </createTable> </changeSet> <changeSet author="zhaoyanhao" id="1565662890214-4" objectQuotingStrategy="QUOTE_ALL_OBJECTS"> <addPrimaryKey columnNames="id" constraintName="PRIMARY" tableName="test2"/> </changeSet> </databaseChangeLog>
7、執行changelog,寫入數據庫
在changeset中添加createTable語句,執行liquibase,使用命令:
liquibase:update 將changelog變化的內容寫入數據庫
liquibase:updateSQL 檢查changelog語法的合法性
8、在項目中使用liquibase
@Bean public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) { SpringLiquibase liquibase = new SpringLiquibase(taskExecutor, env); liquibase.setDataSource(dataSource); //制定changelog的位置,這里使用的一個master文件引用其他文件的方式 liquibase.setChangeLog("classpath:config/liquibase/db.changelog-master.xml"); liquibase.setContexts(liquibaseProperties.getContexts()); liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); liquibase.setDropFirst(liquibaseProperties.isDropFirst()); return liquibase; }
第三方調用liquibase可以參考:https://blog.csdn.net/weixin_34087307/article/details/91397914
liquibase命令大全
命令名稱 | 命令描述 |
---|---|
update | 更新數據庫到當前版本 |
updateSQL | 寫入SQL將數據庫更新到currentversion或STDOUT |
updateCount <num> | 將下一個NUM更改應用到數據庫 |
updateCountSQL <num> | 寫入SQL以將下一個NUM更改應用到數據庫 |
updateToTag <tag> | 使用指定的標記將數據庫更新到變更集 |
updateToTagSQL <tag> | 使用指定的標記將SQL寫入(到標准輸出)到更改集 |
rollback <tag> | 將數據庫回滾到指定標簽的狀態is was |
rollbackSQL <tag> | 生成數據庫回滾到指定標簽的sql |
rollbackToDate <date/time> | 將數據庫回滾到給定日期/時間的狀態is was。日期格式:yyyy-MM-dd 'HH: mm: ss |
rollbackToDateSQL <date/time> | 寫入SQL以將數據庫回滾到給定日期/時間版本的狀態到STDOUT |
rollbackCount <value> | 回滾應用於數據庫的最后一個<值>更改集 |
rollbackCountSQL <value> | 寫入SQL以回滾最后一個<值>更改集到應用於數據庫的stdoutapply |
futureRollbackSQL | 寫入SQL,以便在更改日志中的更改完成后將數據庫回滾到當前狀態 |
futureRollbackSQL <value> | 在更改日志中的<值>更改完成后,寫入SQL以將數據庫回滾到當前狀態 |
futureRollbackFromTagSQL <tag> | 寫入(到標准輸出)SQL,以便在更改后將數據庫回滾到其當前狀態 |
updateTestingRollback | 更新數據庫,然后再次回滾更改。用於測試回滾支持 |
generateChangeLog | 寫入更改日志XML以將數據庫的當前狀態復制到標准輸出 |
snapshot | 將數據庫的當前狀態寫入標准輸出 |
snapshotReference | 將referenceUrl數據庫的當前狀態寫入標准輸出 |
Diff Commands | 數據庫對比命令 |
diff [diff parameters] | 數據庫對比命令 |
diffChangeLog [diff parameters] | 數據庫對比日志 |
Documentation Commands | 文檔命令 |
dbDoc <outputDirectory> | 基於當前數據庫和更改日志生成類似javadoc的文檔 |
Maintenance Commands | 維護命令 |
tag <tag string> | 給當前的數據庫打標簽,方便日后回滾 |
tagExists <tag string> | 檢查對應的標簽是否存在 |
status [--verbose] | 輸出為執行changeset的行數 |
unexpectedChangeSets[--verbose] | 輸出本地不存在changeset 行數 |
validate | 檢查是否有錯誤的changelog |
calculateCheckSum <id> | 檢查指定changeset id 的checksum值 格式為 filepath::id::author |
clearCheckSums | 從數據庫日志中刪除所有保存的校驗和 |
changelogSync | 標記所有的更改已執行 |
changelogSyncSQL | 生成標記更改已執行的sql並輸出到標准輸出 |
markNextChangeSetRan | 將下一個變更標記為已執行 |
markNextChangeSetRanSQL | 生成將下一個變更標記為已執行的sql並輸出到標准輸出 |
listLocks | 列出liquibase數據庫鎖 |
releaseLocks | 釋放所有的liquibase數據庫鎖 |
dropAll | 刪除數據庫表(慎用!) |