Liquibase是一個用於跟蹤、管理和應用資料庫變化的開源的資料庫重構工具。它將所有資料庫的變化(包括結構和數據)都保存在XML文件中,便於版本控制。 Liquibase具備如下特性:* 不依賴於特定的資料庫,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/Pos ...
Liquibase是一個用於跟蹤、管理和應用資料庫變化的開源的資料庫重構工具。它將所有資料庫的變化(包括結構和數據)都保存在XML文件中,便於版本控制。
Liquibase具備如下特性:
* 不依賴於特定的資料庫,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché/h2等12種資料庫,這樣在資料庫的部署和升級環節可幫助應用系統支持多資料庫。
* 提供資料庫比較功能,比較結果保存在XML中,基於該XML你可用Liquibase輕鬆部署或升級資料庫。
* 以XML存儲資料庫變化,其中以作者和ID唯一標識一個變化(ChangSet),支持資料庫變化的合併,因此支持多開發人員同時工作。
* 在資料庫中保存資料庫修改歷史(DatabaseChangeHistory),在資料庫升級時自動跳過已應用的變化(ChangSet)。
* 提供變化應用的回滾功能,可按時間、數量或標簽(tag)回滾已應用的變化。通過這種方式,開發人員可輕易的還原資料庫在任何時間點的狀態。
* 可生成資料庫修改文檔(HTML格式)
* 提供數據重構的獨立的IDE和Eclipse插件。
Liquibase的核心就是存儲變化的XML
其中,changeSet包含不同的資料庫變化,幾乎涵蓋了所有的資料庫變化類型,具體支持的類型要看API,我這裡給幾個例子:
* 創建和刪除表、視圖、存儲過程、主鍵、外鍵、索引等
* 重命名錶、視圖、列等
* 加入列預設值、唯一約束、非空約束等
* 合併兩個列
* 在一個表的數據的基礎上創建一個字典表
除此之外,Liquibase還允許你運行自己的Sql腳本、執行Shell程式。
springboot集成liquibase
1.添加依賴
springboot內置了對liquibase整合的支持,我們只需要在項目中引入liquibase的依賴,進行配置即可。
在pom文件中添加以下依賴:
1 <dependency> 2 <groupId>org.liquibase</groupId> 3 <artifactId>liquibase-core</artifactId> 4 </dependency>
2.配置application.properties(或application.yml)文件
1 liquibase.change-log=classpath:changeLog.xml //存儲變化的xml文件的位置 2 liquibase.user=sa //訪問資料庫的用戶名 3 liquibase.password= //訪問資料庫的密碼 4 liquibase.url=jdbc:h2:file:~/.h2/testdb //訪問資料庫的連接地址 5 liquibase.enabled=true //啟用liquibase 6 liquibase.drop-first=false //預設為false,如果設置為true,liquibase將首先刪除所有資料庫對象的所有連接的用戶。
3.編寫存儲變化的xml文件
文件位置與配置文件上位置一致,例如:
1 <?xml version="1.0" encoding="utf-8"?> 2 <databaseChangeLog 3 xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 6 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"> 7 8 <property name="autoIncrement" value="true" dbms="h2"/> 9 <changeSet id="init-schema" author="jinzhe" > 10 <comment>init schema</comment> 11 <createTable tableName="user"> 12 <column name="id" type="bigint" autoIncrement="${autoIncrement}"> 13 <constraints primaryKey="true" nullable="false"/> 14 </column> 15 <column name="username" type="varchar(20)" > 16 <constraints nullable="false" uniqueConstraintName="username"/> 17 </column> 18 <column name="password" type="varchar(20)"> 19 <constraints nullable="false"/> 20 </column> 21 <column name="email" type="varchar(20)"> 22 <constraints nullable="false"/> 23 </column> 24 <column name="phone" type="varchar(11)"> 25 <constraints nullable="false"/> 26 </column> 27 <column name="sex" type="varchar(2)"> 28 <constraints nullable="false"/> 29 </column> 30 <column name="create_time" type="java.util.Date"> 31 <constraints nullable="false"/> 32 </column> 33 <column name="update_time" type="java.util.Date"> 34 <constraints nullable="false"/> 35 </column> 36 </createTable> 37 </changeSet> 38 </databaseChangeLog>
4.啟動項目
瀏覽器輸入 http://localhost:8080/h2-console ,然後輸入用戶名和密碼,發現此時表已經建好。
5.除此之外,我們還可以通過自己創建SpringLiquibase的方式,來執行change-log文件中的內容。
1 @Configuration 2 @EnableConfigurationProperties(LiquibaseProperties.class) 3 public class DataSourceConfig { 4 @Bean 5 public DataSource dragonHADataSource() throws Exception { 6 return new DragonHADatasourceBuilder().build("dragon/dragon-ha-config.xml"); 7 } 8 @Bean 9 public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) throws Exception{ 10 SpringLiquibase liquibase=new SpringLiquibase(); 11 liquibase.setDataSource(dataSource); 12 liquibase.setChangeLog(liquibaseProperties.getChangeLog()); 13 liquibase.setShouldRun(liquibaseProperties.isEnabled()); 14 liquibase.setDropFirst(liquibaseProperties.isDropFirst()); 15 return liquibase; 16 } 17 }
在這裡我們為 SpringLiquibase 註入了一個數據源 DragonHADataSource 。
SpringLiquibase實現 InitializingBean 介面,覆寫了 afterPropertiesSet() 方法,這個方法是 change-log 文件處理的入口。
6.集成h2資料庫
在 application.properties 文件(或者 application.yml 文件)中添加以下設置:
1 #thymeleaf模板設置 2 spring.thymeleaf.mode=HTML5 3 spring.thymeleaf.encoding=UTF-8 4 spring.thymeleaf.content-type=text/html 5 spring.thymeleaf.cache=false 6 7 #h2資料庫設置 8 spring.jpa.show-sql=true 9 spring.jpa.hibernate.ddl-auto=none 10 spring.datasource.url = jdbc:h2:file:~/.h2/testdb 11 spring.h2.console.enabled=true 12 13 #liquibase設置 14 liquibase.change-log=classpath:changelog/init.xml 15 liquibase.user=sa 16 liquibase.password= 17 liquibase.url=jdbc:h2:file:~/.h2/testdb 18 liquibase.enabled=true 19 liquibase.drop-first=true
在h2資料庫設置里應該通過 spring.jpa.hibernate.ddl-auto=none 關閉hibernate的資料庫自動創建|更新|驗證資料庫表結構功能,此時,liquibase和h2資料庫使用同一個數據源。
這樣,每次重啟項目的時候,都可以進行CURD操作,但是重啟項目數據都會初始化,方便開發者使用。
參考:https://segmentfault.com/a/1190000007002140
http://blog.csdn.net/liuchuanhong1/article/details/54629967