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的插件,如下图:
逆向生成现有数据库的change-log文件
双击运行此功能,按照我们的设置逆向生成changelog文件
生成结果:
下面是生成的文件的格式,我们稍后再做解读
配置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文件生成制定的数据库表(注意,如果数据中该表已经存在的话,启动可能会报“数据库已经存在”的错,我们可以将数据库表删除,在启动项目即可)
项目启动后,会重新创建此数据库表,并且还会在数据库中生成两张表。
其中‘DATABASECHANGELOG‘此表中记录,changelog的执行记录
‘DATABASECHANGELOGLOCK’ 此表是一个锁,当有changelog执行的时候,会获取这个锁,其他线程的changelog是需要等到当前changelog执行完毕释放锁后再执行。保证了线程安全性。