该笔记记录了springboot整合liquibase之后,如何根据liquibase ChangeLogFile对数据库进行修改以及回滚操作

参考:

baeldung.com

JHipster

1. 利用changeLog文件对数据库进行修改

  1. 引入liquibase依赖
  2. 在resource目录下新建db.changelog-master.xml作为变更集文件
  3. 修改application加入liquibase的配置,主要配置变更集文件位置
  4. 运行项目,即可根据变更集文件的内容对数据库进行修改

master.xml简单格式:

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd">
<changeSet author="chunmiaoz (generated)" id="1604474279717-1">
<createTable tableName="user">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="phone" type="VARCHAR(11)"/>
<column name="username" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
</databaseChangeLog>

2. 从现有数据库表生成changeLog文件

  1. 在数据库中建表
  2. 新建一个liquibase.properties并配置数据库地址、用户名密码、驱动
  3. 在有liquibase.properties的目录下打开cmd,输入命令
liquibase --changeLogFile=dbchangelog.xml generateChangeLog

会自动生成一个dbchangelog.xml的目标文件

Liquibase可根据目标文件后缀名生成对应类型的变更集文件,如.yaml会生成yaml格式的

liquibase.properties:

# Enter the path for your changelog file.
changeLogFile=dbchangelog.xml #### Enter the Target database 'url' information ####
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true # Enter the username for your Target database.
username: root # Enter the password for your Target database.
password: 123456

3. 从使用JPA导出的jar包生成changeLog文件

  1. 新建一个项目,引入jpa依赖
  2. 修改application,配置jpa的ddl-auto属性为create
  3. 新建实体类
  4. 将项目打包成jar文件
  5. 在jar文件目录下,新建liquibase.properties并配置相应的属性
  6. 在该目录打开cmd,输入命令
Liquibase --logLevel=INFO --defaultsFile=liquibase.properties generateChangeLog

即可自动生成dbchangelog.xml文件

Liquibase.properties:

# jar包地址
classpath=liquibase-demo-0.0.1-SNAPSHOT.jar # Enter the path for your changelog file.
changeLogFile=dbchangelog.xml #### Enter the Target database 'url' information ####
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true # Enter the username for your Target database.
username: root # Enter the password for your Target database.
password: 123456

4. 回滚Liquibase生成的数据库

利用liquibase的命令

liquibase update

生成的数据库表单,可以利用命令使数据库回滚

liquibase rollbackCount 1 //回滚一条记录
liquibase rollbackToDate YYYY-MM-DD HH:MM:SS //回滚到指定日期

5. Springboot集成的liquibase回滚操作

通过借鉴jhipster的liquibase配置结构完成此功能

前提:liquibase回滚时,要求databasechangelog和更改集文件一致。

  1. 在项目中,resource目录下配置master.xml主变更集文件,目的是将子更改集include进来
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd">
<include file="db/changelog/202011051610-added-person.xml" relativeToChangelogFile="false"></include>
</databaseChangeLog>
  1. 新建202011051610-added-person.xml子变更集文件,位置为src\main\resources\db\changelog\db.changelog-master.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd">
<changeSet author="chunmiaoz (generated)" id="1604474279717-1">
<createTable tableName="user">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="phone" type="VARCHAR(11)"/>
<column name="username" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet> <changeSet id="202011041617-added-person" author="Chunmiao">
<createTable tableName="person">
<column name="id" type="INT">
<constraints primaryKey="true" nullable="false" unique="true" ></constraints>
</column>
<column name="name" type="VARCHAR(255)">
<constraints nullable="false"></constraints>
</column>
<column name="address" type="VARCHAR(255)"></column>
<column name="city" type="VARCHAR(255)"></column>
</createTable>
</changeSet> <changeSet id="202011041621-added-company" author="Chunmiao">
<createTable tableName="company">
<column name="id" type="INT">
<constraints primaryKey="true" nullable="false" unique="true"></constraints>
</column>
<column name="name" type="VARCHAR(255)">
<constraints nullable="false"></constraints>
</column>
<column name="address" type="VARCHAR(255)"></column>
<column name="city" type="VARCHAR(255)"></column>
</createTable>
</changeSet> <changeSet id="202011041621-alert-person" author="Chunmiao">
<addColumn tableName="person">
<column name="country" type="VARCHAR(2)">
</column>
</addColumn> <rollback>
<dropColumn tableName="person" columnName="country"></dropColumn>
</rollback>
</changeSet>
</databaseChangeLog>
  1. 修改pom.xml,为maven增加liquibase插件
        <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<changeLogFile>${basedir}/src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile>
<url>jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8</url>
<username>root</username>
<password>123456</password>
</configuration>
</plugin>
</plugins>
  1. 运行项目,可以发现liquibase会自动创建数据库表
  2. 执行回滚操作,在命令行中利用maven命令

    mvn liquibase:rollback -Dliquibase.rollbackCount=1
  3. 利用maven执行变更集任务可以使用命令

    mvn liquibase:update

已知问题:

在springBoot中,由于liquibase update是由springBoot完成的,手动在命令行中对该changeLog执行回滚操作,虽然会提示成功,但是数据库中的数据实际没有发生回滚。

原因:

springBoot中changelogFile位置为classpath:db/changelog/db.changelog-master.xml

而在命令行中,无法将文件位置表示为classpath:的形式,文件名字不同会被liquibase认为是不同的版本管理

解决方法:

将changeSet定义在子变更集中,在主变更集中引入子变更集,这样不管在什么环境里,changeSet的路径都被表示为在主变更集中配置的一样,从而避免了路径不同的冲突

Liquibase+SpringBoot的简单使用笔记!update+rollback的更多相关文章

  1. Element ui结合springboot的简单实战

    Eelment UI简单实战 前端开发 1 创建项目,导入element ui(略) 2 大致设计出想要的效果,如下 3 创建包 根据设计的大致模样在项目的components中创建对应的包,方便以后 ...

  2. 3.2 配置构建Angular应用——简单的笔记存储应用

    本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...

  3. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  4. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  5. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  6. SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]

    SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...

  7. springboot+thymeleaf简单使用

    关于springboot想必很多人都在使用,由于公司项目一直使用的是SpringMVC,所以自己抽空体验了一下springboot的简单使用. 环境搭建 springbooot的环境搭建可以说很灵活, ...

  8. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  9. Springboot接口简单实现生成MySQL插入语句

    Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...

随机推荐

  1. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字

    084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...

  2. 【题解】CF413C Jeopardy!

    \(\color{blue}{Link}\) \(\text{Solution:}\) 首先,显然的策略是把一定不能翻倍的先加进来.继续考虑下一步操作. 考虑\(x,y\)两个可以翻倍的物品,且\(a ...

  3. 【题解】[CQOI]动态逆序对

    题目链接 题意如题,维护一个动态序列的逆序对总数. 注意题目给的是\([1,n]\)的排列,所以没必要离散化了. 考虑逆序对:二维偏序可以用树状数组做,现在是三维偏序,即加了一个时间维度. 找一个数前 ...

  4. golang常用库:配置文件解析库-viper使用

    一.viper简介 viper 配置解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cob ...

  5. windows server2008 r2激活

    KMS激活: 管理员运行cmd 输入以下命令 slmgr /ipk 密钥slmgr /skms zh.us.toslmgr /atoslmgr /xpr 可用密钥如下: KMS Windows Ser ...

  6. TMS, XYZ & WMTS的不同

    WMS是OGC定义的协议,用于请求任意区域的渲染地图图像.客户可以根据需要以平铺模式对其进行请求. WMS-C是OSGeo创建的WMS扩展,它向功能文档中添加了元数据,以使客户端知道在哪里发出请求,从 ...

  7. JVM系列【2】Class文件结构

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 如何查看class字节码文件 在idea中可以通过插件BinEd来查看二进 ...

  8. 【9】进大厂必须掌握的面试题-DevOps面试

    Q1.DevOps和Agile之间的根本区别是什么? 下表中列出了两者之间的差异. 特征 DevOps--开发运维 Agile--敏捷 敏捷 开发和运营中的敏捷性 只有发展才能敏捷 流程/实践 涉及C ...

  9. sql 存储过程 输出参数 输入参数

    1.简单的存储过程 create procedure porc_name as select * from 表 go 调用时: exec proc_name 2. 带参数的存储过程 create pr ...

  10. 第十三章 nginx代理服务

    一.数据库迁移 1.常见原因 1.数据库要做升级2.数据库服务器到期需要迁移 2.新服务器搭建数据库 [root@db02 ~]# yum install -y mariadb-server 3.启动 ...