LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。其有点主要有以下:

  • 支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
  • 支持多开发者的协作维护;
  • 日志文件支持多种格式,如XML, YAML, JSON, SQL等;
  • 支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等。

liquibase 官方文档地址:http://www.liquibase.org/documentation/index.html

一、引入依赖

先在 pom 文件里引入依赖

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

复制

二、指定配置文件位置

在代码中新建一个 LiquibaseConfig 类,用于配置 Liquibase,指定配置文件的位置。

import javax.sql.DataSource;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class LiquibaseConfig {@Beanpublic SpringLiquibase liquibase(DataSource dataSource) {SpringLiquibase liquibase = new SpringLiquibase();liquibase.setDataSource(dataSource);//指定changelog的位置,这里使用的一个master文件引用其他文件的方式liquibase.setChangeLog("classpath:liquibase/master.xml");liquibase.setContexts("development,test,production");liquibase.setShouldRun(true);return liquibase;}
}

复制

三、编写配置文件

目录结构:

src/main/resources 下新建一个文件夹:liquibase,用来存放跟 liquibase 相关的文件。

master.xml

然后在 liquibase 文件夹下新建 master.xml 作为主文件。

<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"><span class="hljs-tag"><<span class="hljs-name">includeAll</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"liquibase/changelogs/"</span> <span class="hljs-attr">relativeToChangelogFile</span>=<span class="hljs-string">"false"</span>/></span></databaseChangeLog>

复制

includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include

includeAll 标签里有两个属性:path 和 relativeToChangelogFile

Attribute Description
file Name of the file to import required
relativeToChangelogFile Is the file path relative to the root changelog file rather than to the classpath. Defaults to “false” since 1.9

path (在 include 标签里是 file):指定要加载的文件或文件夹位置

relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。

changelog

另在 liquibase 文件夹下新建 changelogs 文件夹用来存放 changelog。

这里新建一个 changelog-1.0.xml

<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"><span class="hljs-tag"><<span class="hljs-name">changeSet</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"20190713-01"</span> <span class="hljs-attr">author</span>=<span class="hljs-string">"solo"</span>></span><span class="hljs-tag"><<span class="hljs-name">createTable</span> <span class="hljs-attr">tableName</span>=<span class="hljs-string">"project_info"</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目id"</span>></span><span class="hljs-tag"><<span class="hljs-name">constraints</span> <span class="hljs-attr">primaryKey</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">nullable</span>=<span class="hljs-string">"false"</span>/></span><span class="hljs-tag"></<span class="hljs-name">column</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_name"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(255)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目名字"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_difficulty"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"float"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目难度"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"category_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目类型类目编号"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_status"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"int(11)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目状态, 0招募中,1 进行中,2已完成,3失败,4延期,5删除"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_desc"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(512)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目简介"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_creater_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目创建者id"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"team_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目所属团队id"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"create_time"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bigint(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"创建时间"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"update_time"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bigint(64)"</span> <span class="hljs-attr">encoding</span>=<span class="hljs-string">"utf8"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"更新时间"</span>/></span><span class="hljs-tag"></<span class="hljs-name">createTable</span>></span>
<span class="hljs-tag"></<span class="hljs-name">changeSet</span>></span><span class="hljs-tag"><<span class="hljs-name">changeSet</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"20190713-02"</span> <span class="hljs-attr">author</span>=<span class="hljs-string">"solo"</span>></span><span class="hljs-tag"><<span class="hljs-name">createTable</span> <span class="hljs-attr">tableName</span>=<span class="hljs-string">"project_category"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目类型表"</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目类型id"</span>></span><span class="hljs-tag"><<span class="hljs-name">constraints</span> <span class="hljs-attr">primaryKey</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">nullable</span>=<span class="hljs-string">"false"</span>/></span><span class="hljs-tag"></<span class="hljs-name">column</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(255)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"类目类型名称"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"status"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"int(11)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"状态。1正常,2删除"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"remark"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(255)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"备注"</span>/></span><span class="hljs-tag"></<span class="hljs-name">createTable</span>></span>
<span class="hljs-tag"></<span class="hljs-name">changeSet</span>></span><span class="hljs-tag"><<span class="hljs-name">changeSet</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"20190713-03"</span> <span class="hljs-attr">author</span>=<span class="hljs-string">"solo"</span>></span><span class="hljs-tag"><<span class="hljs-name">createTable</span> <span class="hljs-attr">tableName</span>=<span class="hljs-string">"project_like_user"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目点赞表"</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"主键id"</span>></span><span class="hljs-tag"><<span class="hljs-name">constraints</span> <span class="hljs-attr">primaryKey</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">nullable</span>=<span class="hljs-string">"false"</span>/></span><span class="hljs-tag"></<span class="hljs-name">column</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目id"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"user_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"点赞的用户id"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"status"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"int(11)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"点赞状态,0 取消点赞,1点赞"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"type"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"int(11)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"类型 1点赞"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"create_time"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bigint(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"创建时间"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"update_time"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bigint(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"更新时间"</span>/></span><span class="hljs-tag"></<span class="hljs-name">createTable</span>></span>
<span class="hljs-tag"></<span class="hljs-name">changeSet</span>></span><span class="hljs-tag"><<span class="hljs-name">changeSet</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"20190713-04"</span> <span class="hljs-attr">author</span>=<span class="hljs-string">"solo"</span>></span><span class="hljs-tag"><<span class="hljs-name">createTable</span> <span class="hljs-attr">tableName</span>=<span class="hljs-string">"project_picture"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目图片表"</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"图片id"</span>></span><span class="hljs-tag"><<span class="hljs-name">constraints</span> <span class="hljs-attr">primaryKey</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">nullable</span>=<span class="hljs-string">"false"</span>/></span><span class="hljs-tag"></<span class="hljs-name">column</span>></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"project_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"项目id"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"picture_url"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"图片地址"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"picture_url_32"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"图片地址32位"</span>/></span><span class="hljs-tag"><<span class="hljs-name">column</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"picture_url_64"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"varchar(64)"</span> <span class="hljs-attr">remarks</span>=<span class="hljs-string">"图片地址64位"</span>/></span><span class="hljs-tag"></<span class="hljs-name">createTable</span>></span>
<span class="hljs-tag"></<span class="hljs-name">changeSet</span>></span></databaseChangeLog>

复制

如果你的项目一开始就用了 liquibase,那可以像上面这样写,把建表语句都写在 changelog 里。

如果一开始没用,后期想引入 liquibase,可以把以前的数据库导出成 sql,然后引入 sql 文件。方式如下:

<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"><span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">file</span>=<span class="hljs-string">"liquibase/changelogs/project.sql"</span> <span class="hljs-attr">relativeToChangelogFile</span>=<span class="hljs-string">"false"</span>/></span></databaseChangeLog>

复制

直接把项目导出的数据库文件 project.sql 通过 include 标签引进来。

如果 <include> 的方式 sql 文件报错,可以换种方式引入,用 <sqlFile> 标签

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"><changeSet id=<span class="hljs-string">"1"</span> author=<span class="hljs-string">"solo"</span>><sqlFile path=<span class="hljs-string">"classpath:/liquibase/changelogs/project.sql"</span> encoding=<span class="hljs-string">"UTF-8"</span> />
</changeSet></databaseChangeLog>

复制

以上就是 SpringBoot 整合 Liquibase 的全部内容。

展开阅读全文
lasspath:/liquibase/changelogs/project.sql" encoding=“UTF-8” />

```

复制

以上就是 SpringBoot 整合 Liquibase 的全部内容。

展开阅读全文

SpringBoot 整合 liquibase相关推荐

  1. springboot整合liquibase(补充)

    对 参考博客地址:SpringBoot 整合 liquibase 做了一些补充: 目录: 导入依赖: <!-- LiquiBase 数据库版本管理组件 --><dependency& ...

  2. 使用liquibase进行数据库迁移(Postgresql/Mysql)——springboot整合Liquibase以及使用maven命令执行Liquibase同步更新数据

    文章目录 一.什么是Liquibase? 1.liquibase的优点 2.liquibase的基本概念 3.官网地址 二.SpringBoot整合Liquibase 1.简介 2.项目结构 3.测试 ...

  3. springboot整合liquibase入门实例

    1,新建springboot工程时选中mysql和liquibase,这样就不用在pom中添加dependence了 2,项目目录结构 3.pom文件依赖,依赖 spring-boot-starter ...

  4. SpringBoot整合liquibase

    源码分析: class LiquibaseChangelogMissingFailureAnalyzer extends AbstractFailureAnalyzer<ChangeLogPar ...

  5. springboot整合Actuator监控

    springboot整合Actuator监控. 1.简要说明: Actuator提供了对springboot应用程序监视和管理的能力,可以选择通过使用HTTP Endpoint或者使用JMX来管理和监 ...

  6. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  7. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  8. springboot整合shiro使用shiro-spring-boot-web-starter

    此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...

  9. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件 先配置MySQL,代码如下 spring: datasour ...

  10. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

最新文章

  1. Entity Framework CodeFirst数据迁移
  2. 预备作业02 20162316刘诚昊
  3. Thinkphp中import的几个用法详细介绍
  4. PowerDesigner的逆向工程.
  5. linux bash文件,linux之bash配置文件
  6. vue 表单 验证 async-validator
  7. 一杯水怎么测试_一杯水就能鉴别翡翠真假的高招
  8. Win11任务栏颜色如何更改 Win11更改任务栏颜色教程
  9. 安全戴尔服务器销售,PowerEdge T340
  10. python求n的阶乘并输出身份信息_python编程求n的阶乘_使用Python编程的阶乘
  11. 一直当菜鸟吧!——关于全局变量
  12. swift 可选链_Swift可选链
  13. Java小白进阶笔记(5)-进阶面向对象
  14. golang之web编程入门
  15. 新版捷兔云支付网站源码开源版 第三方支付源码 第四方支付源码 免签约支付源码
  16. 怎样把PDF文件压缩变小?
  17. scikit-learn 线性回归算法库小结
  18. 3.4 Postman调用手顺(Netsuite相关)
  19. 基于博客系统的访客日志记录----代码合集
  20. 前端程序员未来如何发展?

热门文章

  1. canvas width/height和style.width/style.height
  2. 使用include实现布局(layout)复用
  3. ORACLE纯SQL实现多行合并一行【转】
  4. 【Oracle学习】archivelog
  5. Delphi多层开发方案比较
  6. swagger上传文件并支持jwt认证
  7. 与Android热更新方案Amigo的亲密接触
  8. springmvc mybatis redis mysql maven搭建基本开发框架 (二)
  9. SQL Server 中位数、标准差、平均数
  10. HDU 1754 I Hate It 线段树RMQ