liquibase介绍

liquibase是一款用于数据库管理重构以及迁移的一款开源工具。
他通过文件记录对数据库的修改,将数据库更新或者会滚到对应的状态。
liquibase目前支持目前大部分主流的数据库,例如mysql、MySQL, PostgreSQL, Oracle, Sql Server, DB2等等。

为什么会选择liquibase:

1、统一记录数据库的变更
在项目开发的过程中,经常会因为需求的变更导致已经设计好的数据库表需要添加字段。如果不将这些字段统一维护起来,那么当项目部署到其他环境时有可能会引发项目部署失败。
2、liquibase的记录文件可以被git管理。
这样就可以支持多人进行维护。
3、丰富的日志文件格式。
支持如XML, YAML, JSON, SQL多种记录的文件格式
4、支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等;

引入liquibase

因为我们的项目是maven项目所以只介绍maven项目引入liquibase

引入liquibase的maven坐标

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

一般我们在项目开发前会先进行数据库的设计,那么已经创建好的数据如果用liquibase管理呢?
我们可以使用liquibase的maven插件,对已经创建好的数据库进行逆向生成change-log(liquibase 记录数据库变更的文件,一般为xml格式)

设置liquibase 的maven插件

我们可以根据此模板来配置liquibase的插件配置文件

<plugin>
     <groupId>org.liquibase</groupId>
      <artifactId>liquibase-maven-plugin</artifactId>
      <version>3.4.2</version>
      <configuration>
          <changeLogFile>${basedir}/src/main/resources/liquibase/authentication/changelog.xml</changeLogFile>
          <!--changelog文件生成位置-->
          <outputChangeLogFile>${basedir}/src/main/resources/liquibase/authentication/changelog.xml</outputChangeLogFile>
          <!--数据库连接-->
          <driver>com.mysql.jdbc.Driver</driver>
          <url>jdbc:mysql://127.0.0.1:3306/test</url>
          <username>root</username>
          <password>123456</password>
          <!--输出文件编码-->
          <outputFileEncoding>UTF-8</outputFileEncoding>
          <!--执行的时候是否显示详细的参数信息-->
          <verbose>true</verbose>
          <!--连接非本地数据库是否弹出提示框-->
          <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
          <!--生成changelog文件内容-->
          <diffTypes>tables, views, columns, indexs,foreignkeys, primarykeys, uniqueconstraints, data</diffTypes>
      </configuration>
   </plugin>

配置好maven插件之后,我们就会在maven的插件列表里看到liquibase的插件,如下图:

项目管理数据架构 项目管理数据库_java

逆向生成现有数据库的change-log文件

双击运行此功能,按照我们的设置逆向生成changelog文件

项目管理数据架构 项目管理数据库_数据库开发_02


生成结果:

项目管理数据架构 项目管理数据库_后端_03


下面是生成的文件的格式,我们稍后再做解读

项目管理数据架构 项目管理数据库_后端_04

配置liquibase

创建matser文件,创建master文件的目的,是为了更好的维护所有的changelog文件

<?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.8.xsd">
    <!--此处引入我们刚才逆向生成的changelog文件,如果数据发生变更,产生的changelog文件都需要引入到master文件中-->
    <include file="/authentication/changelog.xml" relativeToChangelogFile="true" />
</databaseChangeLog>

我们引入liquibase后,需要在项目的配置文件中对liquibase进行配置,liquibase会将对master文件中include的changelog文件进行管理

spring:
  liquibase:
    change-log: classpath:/liquibase/master.xml #

使用changelog创建数据库

当我们配置好liquibase后,启动项目就会按照我们配置的changelog文件生成制定的数据库表(注意,如果数据中该表已经存在的话,启动可能会报“数据库已经存在”的错,我们可以将数据库表删除,在启动项目即可)

项目启动后,会重新创建此数据库表,并且还会在数据库中生成两张表。

项目管理数据架构 项目管理数据库_项目管理数据架构_05


其中‘DATABASECHANGELOG‘此表中记录,changelog的执行记录

项目管理数据架构 项目管理数据库_java_06

‘DATABASECHANGELOGLOCK’ 此表是一个锁,当有changelog执行的时候,会获取这个锁,其他线程的changelog是需要等到当前changelog执行完毕释放锁后再执行。保证了线程安全性。