iquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在XML文件中,便于版本控制。
liquibase说白了就是一个将你的数据库脚本转化为xml格式保存起来,其中包含了你对数据库的改变,以及数据库的版本信息,方便数据的升级和回滚等操作。
(1) 对当前数据库状态生成 changlog:
mvn liquibase:generateChangeLog
(2)只对数据生成 changelog ,(先用别的方式往数据库创建数据后再用此方式生成changelog)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
区别:前者是在changelog中追加表创建语句,生成建表语句和数据插入语句,如果表语句已存在,则只生成建表语句
xml代码:
<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"/>
<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语句:
<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"/>
<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>
在pom文件中添加依赖,然后在application.yml/application.properties定制配置信息(也可以不添加,走默认配置),项目启动时就会去运行指定目录下的数据库更改文件。
(1)导入依赖
<dependency>
<groupId>org.liquibasegroupId>
<artifactId>liquibase-coreartifactId>
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语句
的文件)
<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">
<include file="classpath:config/liquibase/changelog/20200902140435678_add_column_ShopDrug.xml" relativeToChangelogFile="false"/>
databaseChangeLog>
(4)写
xml文件 ——> 新建表结构的xml文件
<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"/>
<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
*
* 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文件中在写一个
标签。每执行一个
就会在数据库中记录一条信息,下次就不在执行,故而改变数据库结构时候不能在原来的
中写,需要重新写一个新的
。