- 本文檔主要介紹內容
- 1:liquibase概念
- 2:liuibase與spring boot集成
- 3:liquibase與數據庫的基本操作
一:什麼是liquibase
LiquiBase(從 2006 年開始投入使用)是一種免費開源的工具,可以實現不同數據庫版本之間的遷移(參見 參考資料)。目前也存在少量其他開源數據庫遷移工具,包括 openDBcopy 和 dbdeploy。LiquiBase 支持 10 種數據庫類型,包括 DB2、Apache Derby、MySQL、PostgreSQL、Oracle、Microsoft®SQL Server、Sybase 和 HSQL。
通過日誌文件的形式記錄數據庫的變更,然後執行日誌文件中的修改,將數據庫更新或回滾到一致的狀態。它的目標是提供一種數據庫類型無關的解決方案,通過執行schema類型的文件來達到遷移。
二:與springboot集成
2.1:引入依賴
<!--Liquibase-->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
2.2:配置Springliquibasebean
@Configuration
public class LiquibaseConfig {
@Bean
public SpringLiquibase liquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
//指定changelog的位置,這裏使用的一個master文件引用其他文件的方式
liquibase.setChangeLog("classpath:liquibase/master.xml");
//liquibase.setContexts("development,test,production");
liquibase.setShouldRun(true);
return liquibase;
}
}
2.3:在resorces中添加liquibase文件夾,然後創建changelog文件夾,在changeelog文件創建xml文件
此處的xml文件是針對數據庫的操作記錄
<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">
<changeSet id="20190713-02" author="solo">
<createTable tableName="dh_project_category" remarks="項目類型表">
<column name="id" type="varchar(64)" remarks="項目類型id">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(255)" remarks="類目類型名稱"/>
<column name="status" type="int(11)" remarks="狀態。1正常,2刪除"/>
<column name="remark" type="varchar(255)" remarks="備註"/>
</createTable>
</changeSet>
</databaseChangeLog>
Id:唯一id
Author:修改人
2.4:在resources中的liquibase文件夾下創建master.xml文件夾,可以將ChangeSet分佈在不同文件中。同時<include/>支持多級引用。
基於此功能可以對項目中的ChangeSet進行有效管理。推薦使用以下規範進行管理。
<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">
<!--
1:includeAll 標籤可以把一個文件夾下的所有 changelog 都加載進來。如果單個加載可以用 include。
2:includeAll 標籤裏有兩個屬性:path 和 relativeToChangelogFile。
2.1:path (在 include 標籤裏是 file):指定要加載的文件或文件夾位置
2.2:relativeToChangelogFile :文件位置的路徑是否相對於 root changelog 是相對路徑,默認 false,即相對於 classpath 是相對路徑。
-->
<includeAll path="liquibase/changelog/" relativeToChangelogFile="false"/>
</databaseChangeLog>
<!--
1:includeAll 標籤可以把一個文件夾下的所有 changelog 都加載進來。如果單個加載可以用 include。
2:includeAll 標籤裏有兩個屬性:path 和 relativeToChangelogFile。
2.1:path (在 include 標籤裏是 file):指定要加載的文件或文件夾位置
2.2:relativeToChangelogFile :文件位置的路徑是否相對於 root changelog 是相對路徑,默認 false,即相對於 classpath 是相對路徑。
-->
2.5:以上操作,完成了liquibase的配置,啓動項目會默認生成兩個表
---Databasechangelog:記錄的是每一次表修改的記錄,裏面會詳細記錄操作的類型和操作
---Databasechangeloglock表用於確保兩臺計算機不會同時嘗試修改數據庫。
Ps:整個文件結構
三:基於liquibase對數據庫的操作
3.1:通過上面的文檔介紹,我們已經知道了liquibase與springboot的集成,並且已經知道,通過master.xml對changelog文件的統一管理,我們可以支持多個不同的changelog的配置和運行,並且已經知道,changlog主要是對數據庫的各自操作,接下來,主要介紹的是changelog對數據庫的操作方式
3.2
3..2.1:創建表
<changeSet id="20190713-01" author="solo">
<createTable tableName="project_info">
<column name="project_id" type="varchar(64)" encoding="utf8" remarks="項目id">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="project_name" type="varchar(255)" encoding="utf8" remarks="項目名字"/>
</createTable>
</changeSet>
<createTable>表是創建表 tableName 表明
<column> 字段標籤,
name:字段名稱
type:字段類型
encoding:編碼類型
remarks:字段註釋
<constraints> 主鍵標籤
primaryKey:是否主鍵
Nullable:是否爲空
項目啓動會自動在數據庫生成project_info表
3.2.2:修改表-添加列
<changeSet id="20190713-01" author="yunshan">
<addColumn tableName="project_info">
<column name="address" type="varchar(255)" encoding="utf8" remarks="地址"/>
</addColumn>
</changeSet>
<addColumn> tableName 修改表名
<column> 字段標籤,
name:字段名稱
type:字段類型
注:1:同一個文件中,changeSet中的id不能重複,
2: 每次數據庫變更,都會在databasechangelog生成一條記錄
3.2.3:修改表-刪除列
<changeSet id="20190713-03" author="yunshan">
<dropColumn tableName="project_info" columnName="address"/>
</changeSet>
3.2.4:修改表-插入數據
<changeSet id="20190713-061" author="yunshan">
<insert tableName="project_info">
<column name="project_id" valueNumeric="312223"/>
<column name="project_status" valueNumeric="322434343"/>
<column name="project_name" value="wkn"/>
</insert>
</changeSet>
<inSert>數據插入標籤
<column> 字段標籤,
name:字段名稱
valueNumeric:對應的字符值
3.2.4:修改表-通過sql腳本
<changeSet id="20200522-02" author="yunshan">
<sqlFile path="liquibase/sql/project_info.sql"/>
</changeSet>
<sqlFile>標籤,指定需要加載的sql路徑
通過上對數據庫的操作,可以自由對數據庫的屬性進行修改,插入數據等
三:基於liquibase對數據庫的回滾操作