1)概述:
iquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在XML文件中,便于版本控制。
liquibase说白了就是一个将你的数据库脚本转化为xml格式保存起来,其中包含了你对数据库的改变,以及数据库的版本信息,方便数据的升级和回滚等操作。
- 目前支持多种数据库,包括Oracle/SqlServer/DB2/MySql/Sybase/PostgreSQL/Cache 等。
- 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
- 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(changset),支持数据库变化的合并,因此支持多开发人员同时合作。
- 在数据库中保存数据库修改历史(DatebaseChangeHistory),在数据库升级时自动跳过以应用的变化(ChangSet)。
- 可生成数据库修改文档(HTML格式)。
- 提供数据重构的独立的IDE 和 Eclipse插件。
2)基本使用
① Liquibase编写规范:
- Changset 的id使用【任务ID】+【日期】+【序号的方式】一般为了简单直接使用日期加序号即可,
- 写上作者,为了以后更改时候确认功能
- Liquibase禁止对业务数据进行操作
- Liquibase禁止使用存储过程
- Liquibase所有的表都加remarks注释
- 已经执行的ChangeSet严禁修改
- 不要随意的升级Liquibase的版本,不同的版本ChangeSet的MD5SUM的算法不一样
(1) 对当前数据库状态生成 changlog:
mvn liquibase:generateChangeLog
(2)只对数据生成 changelog ,(先用别的方式往数据库创建数据后再用此方式生成changelog)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
区别:前者是在changelog中追加表创建语句,生成建表语句和数据插入语句,如果表语句已存在,则只生成建表语句
<changeSet>
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<property name="now" value="now()" dbms="h2"/>
<property name="now" value="now()" dbms="mysql"/>
<property name="autoIncrement" value="true"/>
<property name="floatType" value="float4" dbms="postgresql, h2"/>
<property name="floatType" value="float" dbms="mysql, oracle, mssql"/>
<!--
Added the entity orderDelivery.
-->
<!-- 这是一个创建表的语句 也可以直接写SQL语句 -->
<changeSet id="202008211521-1" author="cxt">
<createTable tableName="order_delivery" remarks="配送表">
<column name="id" type="varchar(22)">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="order_id" type="varchar(22)" remarks="订单表ID">
<constraints nullable="true"/>
</column>
……
<column name="lng" type="double" remarks="当前经度">
<constraints nullable="true"/>
</column>
<column name="lat" type="double" remarks="当前纬度">
<constraints nullable="true"/>
</column>
<column name="receiving_date" type="timestamp">
<constraints nullable="true" />
</column>
<column name="finish_date" type="timestamp">
<constraints nullable="true" />
</column>
</createTable>
</changeSet>
<!-- 删除一些表里的字段 -->
<changeSet id="202008211521-2" author="cxt">
<dropColumn tableName="jhi_order" columnName="room"/>
<dropColumn tableName="jhi_order" columnName="lng"/>
<dropColumn tableName="jhi_order" columnName="delivery_deleted"/>
</changeSet>
</databaseChangeLog>
也可以直接写SQL语句:
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<property name="now" value="now()" dbms="h2"/>
<property name="now" value="now()" dbms="mysql"/>
<property name="autoIncrement" value="true"/>
<property name="floatType" value="float4" dbms="postgresql, h2"/>
<property name="floatType" value="float" dbms="mysql, oracle, mssql"/>
<!-- 直接写SQL语句 -->
<changeSet id="202008211521-2" author="cxt">
<sql>
CREATE TABLE `order_delivery` (
`id` varchar(22) COLLATE utf8_bin NOT NULL,
`order_id` varchar(22) COLLATE utf8_bin DEFAULT NULL COMMENT '订单表ID',
`address` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '地址',
`room` varchar(22) COLLATE utf8_bin DEFAULT NULL COMMENT '门牌号',
`address_lng` double DEFAULT NULL COMMENT '地址经度',
`address_lat` double DEFAULT NULL COMMENT '地址纬度',
…………
`lng` double DEFAULT NULL COMMENT '当前经度',
`lat` double DEFAULT NULL COMMENT '当前纬度',
`receiving_date` timestamp NULL DEFAULT NULL,
`finish_date` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC COMMENT='配送表'
</sql>
</changeSet>
</databaseChangeLog>
② SpringBoot整合Liquibase
在pom文件中添加依赖,然后在application.yml/application.properties定制配置信息(也可以不添加,走默认配置),项目启动时就会去运行指定目录下的数据库更改文件。
(1)导入依赖
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
(2)application.yml 文件中添加配置,指定去找那个配置文件
# Liquibase 配置
liquibase:
url: jdbc:mysql://localhost:3306/stusystem?useUnicode=true&characterEncoding=utf-8
driver: com.mysql.jdbc.Driver
password: root
username: root
enabled: true
change-log: classpath:config/master.xml
(3)master.xml 文件中内容(master文件是为了让系统去找到写了具体表结构SQL语句
的文件)
<?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.5.xsd">
<!-- 这里写清楚更改数据的xml文件路径和名字 -->
<!-- 一个include标签就表示一个表【不准确,初学者可以这么理解】新建表都是从这里出发找到具体表内容 -->
<include file="classpath:config/liquibase/changelog/20200902140435678_add_column_ShopDrug.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>
(4)写<changeSet>
xml文件 ——> 新建表结构的xml文件
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<property name="now" value="now()" dbms="h2"/>
<property name="now" value="now()" dbms="mysql"/>
<property name="autoIncrement" value="true"/>
<property name="floatType" value="float4" dbms="postgresql, h2"/>
<property name="floatType" value="float" dbms="mysql, oracle, mssql"/>
<!--
Added the entity orderDelivery.
-->
<!-- 这是一个创建表的语句 也可以直接写SQL语句 -->
<changeSet id="202008211521-1" author="cxt">
<!-- 那一张表,注释 -->
<createTable tableName="order_delivery" remarks="配送表">
<!-- 表的列,类型 -->
<column name="id" type="varchar(22)">
<!-- 列属性,是否主键,是否为空 -->
<constraints primaryKey="true" nullable="false"/>
</column>
</createTable>
</changeSet>
</databaseChangeLog>
(5)在写javaBean配置文件
package com.stu.stusystem.config;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @date 2020/9/7
* <p>
* Liquibase 的配置文件
*/
@Configuration
public class LiquibaseConfig {
@Qualifier("dataSource")
private DataSource dataSource;
@Bean
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
// xml 入口配置文件地址
liquibase.setChangeLog("classpath:config/master.xml");
liquibase.setContexts("development,test,preproduction,production");
liquibase.setShouldRun(true);
return liquibase;
}
@Autowired
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
然后,在项目中配置好数据库信息,接着启动项目在第一次启动项目的时候就可以在数据库中看到自动创建一系列的表。
如果修改表结构时候就在那个表的xml文件中在写一个<changeSet>
标签。每执行一个<changeSet>
就会在数据库中记录一条信息,下次就不在执行,故而改变数据库结构时候不能在原来的<changeSet>
中写,需要重新写一个新的<changeSet>
。