一、前言
Liquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在XML文件中,便于版本控制。
liquibase说白了就是一个将你的数据库脚本转化为xml格式保存起来,其中包含了你对数据库的改变,以及数据库的版本信息,方便数据的升级和回滚等操作。
二、SpringBoot集成Liquibase
2.1 导入依赖
maven:
<!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.5.0</version>
</dependency>
gradle:
// https://mvnrepository.com/artifact/org.liquibase/liquibase-core
implementation group: 'org.liquibase', name: 'liquibase-core', version: '4.5.0'
2.2 Liquibase配置文件application.yml
spring:
datasource:
url: jdbc:mysql://xxx.xxx.x.xxx:xxxx/liquibase?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
liquibase:
#导包后默认开启,可以不用设置
enabled: true
#主文件路径,可以不配置,不配置会默认去找resource/db/changelog文件夹下找db.changelog-master.yaml文件,如果找不到则会启动报错,如下图
change-log: /liquibase/master.xml
当然,也可以不写配置文件,使用config bean代替,如下:LiquibaseConfig.java
@Configuration
public class LiquibaseConfig {
@Bean
public 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;
}
}
2.3 创建Liquibase文件
这里建的文件夹路径要和配置文件中的路径对应。
master.xml文件:
<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.1.xsd">
<!--
1:includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。
2:includeAll 标签里有两个属性:path 和 relativeToChangelogFile。
2.1:path (在 include 标签里是 file):指定要加载的文件或文件夹位置
2.2:relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。
3: include 标签可以单独指定某一个文件。
-->
<include file="liquibase/changelog/changelog-1.0.xml" />
<!--<includeAll path="liquibase/changelog/" relativeToChangelogFile="false"/>-->
<!--<include file="liquibase/changelog/changelog-1.2.xml" relativeToChangelogFile="false"/>-->
</databaseChangeLog>
changelog-1.0.xml文件:
<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.1.xsd">
<!--建表-->
<changeSet author="Felix.Du" id="20211029-01">
<createTable tableName="dh_project_category" remarks="项目类型表">
<column name="id" type="varchar(64)" remarks="项目类型id">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(255)" remarks="类目类型名称"/>
<column name="status" type="int(11)" remarks="状态。1正常,2删除"/>
<!--test-->
<column name="remark" type="varchar(255)" remarks="备注"/>
</createTable>
</changeSet>
<!--建主键-->
<changeSet author="Felix.Du" id="20211029-02">
<preConditions onFail="MARK_RAN">
<not>
<primaryKeyExists tableName="T_TABLE_NAME" primaryKeyName="ID" />
</not>
</preConditions>
<addPrimaryKey columnNames="ID" tableName="T_TABLE_NAME" />
</changeSet>
<!--增加字段-->
<changeSet author="Felix.Du" id="20211029-03">
<preConditions onFail="MARK_RAN">
<not>
<columnExists tableName="T_TABLE_NAME" columnName="CODE" />
</not>
</preConditions>
<addColumn tableName="T_TABLE_NAME">
<column name="CODE" remarks="" type="VARCHAR2(40)" />
</addColumn>
</changeSet>
<!--删除字段-->
<changeSet author="Felix.Du" id="20211029-04">
<dropColumn columnName="code1" tableName="T_TABLE_NAME" />
</changeSet>
<!--更新数据-->
<changeSet author="Felix.Du" id="20211029-05" dbms="oracle" failOnError="false">
<sql splitStatements="false" stripComments="true">
update t_table_name s set s.code=s.code1
</sql>
</changeSet>
</databaseChangeLog>
id:数据库保存的唯一id
author:对数据库进行修改的负责人,方便出问题的时候能找到对应的负责人。
使用如上的语法基本上能满足平常的工作需要,当然还有更多的功能,读者可以自行百度。当你进行如上操作,启动项目后,会看到数据库会新增两个关于liquibase的表。
databasechangelog:记录的是每一次表修改的记录,里面会详细记录操作的类型和操作。
部分字段释义:
ID:唯一id,在changeSet标签中的id属性配置
AUTHOR : 作者(操作人)
FILENAME:本次操作执行的文件路径+文件名
DATEEXECUTED: 执行日期
ORDEREXECUTED:执行顺序
EXECTYPE:执行类型(已执行,执行失败)
MD5SUM:MD5
DESCRIPTION : 描述
COMMENTS
TAG
LIQUIBASE : liqubase的版本号
CONTEXTS : 备注,可以在changeSet标签中的context属性配置
LABELS :
DEPLOYMENT_ID : Liquibase自动生成的一个id
databasechangeloglock:用于确保两台计算机不会同时尝试修改数据库。
当然也可以直接在changeSet标签中引sql文件。
changelog.xml文件:
<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.1.xsd">
<changeSet context="新建mine_admin表" id="20211029-06" author="Felix.Du">
<sqlFile path="liquibase/sql/mine.sql"/>
</changeSet>
</databaseChangeLog>
mine.sql文件:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for mine_admin
-- ----------------------------
DROP TABLE IF EXISTS `mine_admina`;
CREATE TABLE `mine_admina` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`status` tinyint(1) DEFAULT NULL COMMENT '启用状态0->禁用,1->启用',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='后台管理员';
SET FOREIGN_KEY_CHECKS = 1;
注意:changeSet标签中的id属性不能重复!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/67264.html