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文件中添加以下依赖:

 <dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

2.配置application.properties(或application.yml)文件

 liquibase.change-log=classpath:changeLog.xml  //存储变化的xml文件的位置
liquibase.user=sa //访问数据库的用户名
liquibase.password= //访问数据库的密码
liquibase.url=jdbc:h2:file:~/.h2/testdb //访问数据库的连接地址
liquibase.enabled=true //启用liquibase
liquibase.drop-first=false //默认为false,如果设置为true,liquibase将首先删除所有数据库对象的所有连接的用户。

3.编写存储变化的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.4.xsd"> <property name="autoIncrement" value="true" dbms="h2"/>
<changeSet id="init-schema" author="jinzhe" >
<comment>init schema</comment>
<createTable tableName="user">
<column name="id" type="bigint" autoIncrement="${autoIncrement}">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="username" type="varchar(20)" >
<constraints nullable="false" uniqueConstraintName="username"/>
</column>
<column name="password" type="varchar(20)">
<constraints nullable="false"/>
</column>
<column name="email" type="varchar(20)">
<constraints nullable="false"/>
</column>
<column name="phone" type="varchar(11)">
<constraints nullable="false"/>
</column>
<column name="sex" type="varchar(2)">
<constraints nullable="false"/>
</column>
<column name="create_time" type="java.util.Date">
<constraints nullable="false"/>
</column>
<column name="update_time" type="java.util.Date">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
</databaseChangeLog>

4.启动项目

浏览器输入 http://localhost:8080/h2-console ,然后输入用户名和密码,发现此时表已经建好。

5.除此之外,我们还可以通过自己创建SpringLiquibase的方式,来执行change-log文件中的内容。

 @Configuration
@EnableConfigurationProperties(LiquibaseProperties.class)
public class DataSourceConfig {
@Bean
public DataSource dragonHADataSource() throws Exception {
return new DragonHADatasourceBuilder().build("dragon/dragon-ha-config.xml");
}
@Bean
public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) throws Exception{
SpringLiquibase liquibase=new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog(liquibaseProperties.getChangeLog());
liquibase.setShouldRun(liquibaseProperties.isEnabled());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
return liquibase;
}
}

  在这里我们为 SpringLiquibase 注入了一个数据源 DragonHADataSource 。
  SpringLiquibase实现 InitializingBean 接口,覆写了 afterPropertiesSet() 方法,这个方法是 change-log 文件处理的入口。

6.集成h2数据库

  在 application.properties 文件(或者 application.yml 文件)中添加以下设置:

 #thymeleaf模板设置
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false #h2数据库设置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url = jdbc:h2:file:~/.h2/testdb
spring.h2.console.enabled=true #liquibase设置
liquibase.change-log=classpath:changelog/init.xml
liquibase.user=sa
liquibase.password=
liquibase.url=jdbc:h2:file:~/.h2/testdb
liquibase.enabled=true
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

springboot集成liquibase,h2数据库的更多相关文章

  1. springboot中使用h2数据库(内存模式)

    使用H2的优点,不需要装有服务端和客户端,在项目中包含一个jar即可,加上初始化的SQL就可以使用数据库了 在springboot中引入,我的版本是2.1.4,里面就包含有h2的版本控制 <!- ...

  2. java~springboot~h2数据库在单元测试中的使用

    单元测试有几点要说的 事实上springboot框架是一个tdd框架,你在进行建立项目时它会同时建立一个单元测试项目,而我们的代码用例可以在这个项目里完成,对于单元测试大叔有以下几点需要说明一下: 单 ...

  3. springboot集成h2

    h2数据库是常用的开源数据库,与HSQLDB类似,十分适合作为嵌入式数据库使用,其他的数据库大部分都需要安装独立的客户端和服务器端 h2的优势: (1)h2采用纯java编写,因此不受平台的限制 (2 ...

  4. springBoot 集成Mysql数据库

    springBoot 集成Mysql数据库 前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象.我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框 ...

  5. spring boot2.x中集成H2数据库

    H2数据库介绍  查看 在spring boot中集成 1.添加依赖 <dependency> <groupId>org.springframework.boot</gr ...

  6. SpringBoot集成mybatis,同时读取一个数据库中多个数据表

    SpringBoot集成mybatis,同时读取一个数据库中多个数据表: application.properties: mybatis.config-location=classpath:mybat ...

  7. spring security关闭http验证 和 springboot 使用h2数据库

    spring security关闭http验证 最近在跑demo的过程中,访问swagger页面的时候需要验证登录,记得在之前写的代码中是关闭了security验证,无需登录成功访问,直接在appli ...

  8. springboot集成jpa操作mybatis数据库

    数据库如下 CREATE TABLE `jpa`.`Untitled` ( `cust_id` bigint() NOT NULL AUTO_INCREMENT, `cust_address` var ...

  9. 图数据库Neo4j的基本使用及与SpringBoot集成

    Neo4j 官网地址:https://neo4j.com/ 下载地址:https://neo4j.com/download-center/#community 官方入门文档:https://neo4j ...

随机推荐

  1. EditPlus设置html和js文件的注释快捷键

    EditPlus默认是可以通过快捷键注释html的,格式是 <!-- </label> <label>类型</label> <label> --& ...

  2. 完美运动框架(js)

    一.前言 学习js运动时,由于在实现多种不同运动效果过程中很多代码是重复的,故将其封装达到代码重用. 二.代码封装重用 function startMove(obj, json, fnEnd){ cl ...

  3. Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结

    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结 1. 状态机 理论参考1 2. 词法分析理论1 3. 词法分析实例2 4. ---code fsm 状态机通用 ...

  4. DMA摘记

    1.特点 PIO模式下硬盘和内存之间的数据传输是由CPU来控制的:而在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上 ...

  5. JavaScript之引用类型

    js中的引用类型和其他语言中类的概念很相似,但并不一样. 引用类型是一种数据结构,就像房子的骨架,承载着数据和功能的衔接. 而对象,则是引用类型的具体实现,即实例. var person = new ...

  6. 解决Eclipse的dropins中svn插件不能加载的问题

    在eclipse的dropins中我们将svn的插件放到里边重启我们的ecplise就能正常加载svn插件了,如下图 但是有时候我们删除了svn的项目之后有可能我们的eclipse就不能正常加载svn ...

  7. Building Maintainable Software-java篇之Separate Concerns in Modules

    Building Maintainable Software-java篇之Separate Concerns in Modules   In a system that is both complex ...

  8. 【Python + ATX】之uiautomator2 PageObject模式自动化框架学习

    参考文章: 感谢:cynic (linpengcheng) <ATX 基于 ATX-Server 的 UI 自动化测试框架> <ATX-uiautomator2 实现 webview ...

  9. plsql programming 11 记录类型

    记录类型非常类似数据库表中的行. 记录作为一个整体本身并没有值, 不过每个单独成员或字段都有值, 记录提供了一种把这些值当做一组进行操作的方法. 例如: 1: -- create a table 2: ...

  10. mysql 1005 错误

    建立外键的时候两个 表的相对应的 类型不一致!