继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spring Boot2中使用Liquibase管理数据库

2018-10-27 23:43:0717233浏览

Jimmy

1实战 · 6手记 · 4推荐
TA的实战

Spring Boot2中使用Liquibase管理数据库

Activiti工作流开源软件中使用到了liquibse来初始化数据库,我们这里带大家了解体验一下liquibase

Liquibase简介

Liquibase是一个数据库表结构迭代演进变更的管理工具。开发人员可以不是直接针对某个特定的数据库编写SQL的创建、更新或删除数据库对象,而是在通过XML、YAML、JSON等文件中定义描述他们所需的数据库表结构的变更这些变更可以包含tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints,data。

对数据库的任何更改都会以变更集(ChangeSet)来描述中,Liquibase推荐的做法是每次修改构建一个变更集,以便通过变更集轻松回滚。也可以通过tag对数据库进行更改。比如,在首次发布后将数据库结构标记为1.0。稍后,当发布一些补丁并发布版本1.1时,可以将到目前为止的所有更改标记为1.1。借助这些标记,可以轻松地将数据库结构回滚到某个版本

Liquibase特性

  • 不依赖特定数据库,像Hibernate一样支持几乎所有的主流数据库如MySql,Oracle,PostgreSQL,H2等等
  • 支持数据库的操作非常丰富,如创建或修改表(table)、视图(views)、索引(index)以及数据(data)等
  • 对数据库的变更描述支持多种格式XML、YAML、JSON等
  • 可以记录数据库的变更历史,是通过创建特定的表结果来实现这个功能
  • 可以diff两个数据库的差异
  • 可以轻松的把比如mysql库导出其他支持数据库的sql脚本
  • 支持java命令、Maven、Gradle、Spring Boot集成运行
  • 提供了Eclipse和IDEA的数据库重构插件,但是多年未更新不推荐使用

在Spring Boot2项目中使用

1.创建工程

我们通过curl start.spring.io快速创建这个工程,主要注意添加liquibase这个依赖,另外我们通过h2数据库快速演示数据库的操作,保证系统简单外部依赖,能快速启动。

curl https://start.spring.io/starter.tgz -d dependencies=web,data-jpa,h2,liquibase -d type=maven-project -d baseDir=dbdemo | tar -xzvf -

通过脚本创建一个标准的spring boot工程,可以看一下生产的目录结构

├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── demo
    │   │               └── DemoApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── demo
                        └── DemoApplicationTests.java
 

重点关注一下工程的pom依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.liquibase</groupId>
			<artifactId>liquibase-core</artifactId>
		</dependency>

		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

当spring boot系统默认依赖了liquibase后系统直接通过mvn spring-boot:run启动的时候就会启动失败,报错如下:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.0.6.RELEASE:run (default-cli) on project demo: An exception occurred while running. null: InvocationTargetException: Error creating bean with name 'org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration$LiquibaseConfiguration': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Cannot find changelog location: class path resource [db/changelog/db.changelog-master.yaml] (please add changelog or check your Liquibase configuration) -> [Help 1]

这个错误提示说明我们系统开启liuibase的功能但是对应数据库的的chagelog文件,这里提示的默认changelog文件为 db/changelog/db.changelog-master.yaml,我们可以通过配置
spring.liquibase.enabled=false关闭liquibase的功能,当然这里我们要演示liquibase肯定不能选择直接关闭
,上面提到liquibase支持xml,yaml,json可以看到spring boot项目默认使用了yml格式,我们就遵循“约定大于配置”的原则我们也采用yaml格式演示

2.配置db/changelog/db.changelog-master.yaml

这里参考liquibase官网的一段yaml配置 yaml_format,内容和官网不完全一样,为避免运行问题大家采用下面的yaml内容配置

databaseChangeLog:
  - changeSet:
      id: 1
      author: nvoxland
      changes:
        - createTable:
            tableName: person
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: firstname
                  type: varchar(50)
              - column:
                  name: lastname
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: state
                  type: char(2)

  - changeSet:
      id: 2
      author: nvoxland
      changes:
        - addColumn:
            tableName: person
            columns:
              - column:
                  name: username
                  type: varchar(8)

  - changeSet:
      id: 3
      author: nvoxland
      changes:
        - addLookupTable:
            existingTableName: person
            existingColumnName:state
            newTableName: state
            newColumnName: id
            newColumnDataType: char(2)

简单分析这个端yaml文件,这是liquibase的yaml配置文件,在liquibase定义的数据库变化采用changeSet来表示,这里涉及到3个changeSet,1是创建一个person表,2是为person添加一列为username,3是添加一个state表作为person表中state字段的约束来源

3.配置application.yml或application.properties

spring:
  h2:
    console:
      enabled: true
  datasource:
    url: jdbc:h2:file:~/.h2/testdb

我们采用最小的配置一下数据源相关信息,因为我们演示选中的是h2数据库,所以配置一下spring.h2.console.enabled=true开启一下web数据库管理器

4.启动系统查看数据库

现在通过可以启动我们的程序 mvn spring-boot:run,等程序启动完成,打开浏览器访问 http://localhost:8080/h2-console , 这是一个web版的数据管理器支持中文界面,
h2-console

选择数据库类型Generic H2(Embedded)输入访问数据库的常规配置,点击连接进去操作界面可以看到有四个表
图片描述

show tables;

TABLE_NAME  	TABLE_SCHEMA  
DATABASECHANGELOG	PUBLIC
DATABASECHANGELOGLOCK	PUBLIC
PERSON	PUBLIC
STATE	PUBLIC

我们的yaml配置中说明了创建person和state表,另外两个表示liquidbase的记录表,在spring boot集成的liquibase默认集成了最基本的功能也就是update数据的变化

打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP

热门评论

老师您好

Activiti6.0工作流引擎深度解析

这个课程我学习后遇到个问题。

按照视频讲解,新建电商流程,关联表单,并将APP发布。 启动流程,没有表单填写弹出。当以form key方式关联表单,并启动流程,后台报错org.activiti.form.engine.ActivitiFormObjectNotFoundException: no forms deployed with key ‘xxxxx’ for parent deployment id ‘xxxx’。
我将流程定义文件下载下来看了一下:
1:当采用referenced form 方式进行流程定义与表单关联时,并未出现关联关系;
2:采用form key方式进行流程定义与表单关联时,流程定义文件中存在关联关系,但是启动流程时抛错ActivitiFormObjectNotFoundException

h2的数据库密码是什么啊。。

查看全部评论