springboot集成liquibase,h2数据库
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