1、是什么?
Liquibase官网
Liquibase是一个开源的数据库管理工具,可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用,并提供多种数据库任务自动化功能,例如数据库迁移、版本控制和监控。Liquibase还提供了一个Web界面,可以方便地管理和跟踪数据库变更。它支持Java、Python、Ruby等多种语言,可以轻松地集成到现有的开发环境中。
2、能干嘛?
Liquibase主要功能包括:
- 数据库迁移:可以方便地将数据库从一个版本迁移到另一个版本。
- 版本控制:可以跟踪数据库变更的历史记录,并可以根据需要回滚到以前的版本。
- 监控:可以监控数据库变更,并在发生变更时收到通知。
- 自动化:可以自动化数据库任务,例如在应用程序部署之前检查数据库完整性。
Liquibase可以帮助开发人员更加高效地管理数据库,并减少由于数据库变更而导致的错误。
Liquibase的优点:
- 配置文件支持SQL、XML、JSON 或者 YAML
- 版本控制按序执行
- 可以用上下文控制sql在何时何地如何执行
- 支持schmea的变更
- 根据配置文件自动生成sql语句用于预览
- 可重复执行迁移
- 可插件拓展
- 可回滚
- 可兼容14中主流数据库如oracle,mysql,pg等,支持平滑迁移
- 支持schema方式的多租户(multi-tenant)
3、怎么玩?
这里主要使用SpringBoot整合Liquibase实现对数据库进行版本管理
(1) 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ly</groupId><artifactId>springboot-liquibase</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>4.23.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version></dependency></dependencies>
</project>
(2) 配置数据源
package com.ly.config;import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;import static com.ly.config.DataSourcesConfig.SPRING_DATASOURCE;/*** @author ly (个人博客:https://www.cnblogs.com/ybbit)* @date 2023-07-22 16:28* @tags 喜欢就去努力的争取*/
@ConfigurationProperties(prefix = SPRING_DATASOURCE)
@SpringBootConfiguration
@Data
public class DataSourcesConfig {public static final String SPRING_DATASOURCE = "spring.datasource";private String driverClassName;private String url;private String username;private String password;/*** 数据源配置** @return*/@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(username);return dataSource;}
}
(3) 配置Liquibase
package com.ly.config;import liquibase.integration.spring.SpringLiquibase;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;/*** @author ly (个人博客:https://www.cnblogs.com/ybbit)* @date 2023-07-22 14:53* @tags 喜欢就去努力的争取*/
@ConditionalOnProperty(value = "spring.profiles.active", havingValue = "dev")
@SpringBootConfiguration
public class LiquibaseConfig {public static final String CHANGE_LOG_PATH = "classpath:/liquibase/db.changelog-master.xml";@Beanpublic SpringLiquibase liquibase(DataSource dataSource) {SpringLiquibase liquibase = new SpringLiquibase();liquibase.setChangeLog(CHANGE_LOG_PATH);liquibase.setDataSource(dataSource);liquibase.setShouldRun(true);return liquibase;}}
(4) 创建db.changelog-master.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://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 是相对路径。--><!-- <includeAll path="change/" relativeToChangelogFile="true"/>--><!--加入一张test_create_table表--><include file="classpath:liquibase/change/changelog_v1.0.xml"></include><!--给test_create_table表加一个email字段--><include file="classpath:liquibase/change/changelog_v2.0.xml"></include><!--修改test_create_table表加email字段--><include file="classpath:liquibase/change/changelog_v3.0.xml"></include><!--向test_create_table表加一条数据--><include file="classpath:liquibase/change/changelog_v4.0.xml"></include></databaseChangeLog>
(5) 创建每一项的变更文件(推荐把各个模块的变更都分门别类的整理好)
changelog_v1.0.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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-latest.xsd"><!--changeSet:每一个changeSet对应一个数据库相关的操作author:修改人id:唯一--><!--加入一张表【test_create_table】--><changeSet author="ly" id="2023072201-1"><createTable remarks="用户表" tableName="test_create_table"><column autoIncrement="true" name="id" type="INT" remarks="主键"><constraints nullable="false" primaryKey="true" unique="true"/></column><column name="username" remarks="用户名" type="VARCHAR(32)"><constraints unique="true" nullable="false"/></column><column name="password" remarks="密码" type="VARCHAR(100)"><constraints unique="false" nullable="false"/></column></createTable></changeSet>
</databaseChangeLog>
changelog_v2.0.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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-latest.xsd"><changeSet author="ly" id="2023072202-1"><!--加入一个email字段--><addColumn tableName="test_create_table"><column name="email" type="VARCHAR(32)" remarks="邮箱"><constraints nullable="true"/></column></addColumn></changeSet>
</databaseChangeLog>
changelog_v3.0.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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-latest.xsd"><changeSet author="ly" id="2023072203-1"><!--重命名email列名称--><renameColumn tableName="test_create_table" oldColumnName="email" newColumnName="newEmail" columnDataType="VARCHAR(50)"/></changeSet>
</databaseChangeLog>
changelog_v4.0.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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-latest.xsd"><changeSet author="ly" id="2023072204-1"><!--插入一条数据--><insert tableName="test_create_table"><column name="id" value="1"></column><column name="username" value="zs"></column><column name="password" value="123"></column><column name="newEmail" value="zs@163.com"></column></insert></changeSet>
</databaseChangeLog>
(6) SpringBoot配置文件
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/qbb01username: rootpassword: rootprofiles:active: dev
(7) Main
package com.ly;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;/*** @author ly (个人博客:https://www.cnblogs.com/ybbit)* @date 2023-07-22 14:52* @tags 喜欢就去努力的争取*/
@EnableConfigurationProperties
@SpringBootApplication
public class LiquibaseApplication {public static void main(String[] args) {new SpringApplicationBuilder(LiquibaseApplication.class).run(args);}
}
(7) 启动日志
(8) 数据库
4、ChangeSet标签集与作用
(1) add
标签 | 说明 |
---|---|
addAutoIncrement | 将已存在的列改为自增列 |
addColumn | 增加列 |
addDefaultValue | 增加列的默认值 |
addForeignKeyConstraint | 增加外键 |
addLookupTable | 创建外键的关联表 |
addNotNullConstraint | 增加非空值约束 |
addPrimaryKey | 增加主键 |
addUniqueConstraint | 增加唯一值约束 |
(2) create
标签 | 说明 |
---|---|
createIndex | 创建索引 |
createProcedure | 创建存储过程 |
createSequence | 创建序列 |
createTable | 创建表 |
createView | 创建视图 |
(3) drop
标签 | 说明 |
---|---|
dropAllForeignKeyConstraints | 删除全部外键约束 |
dropColumn | 删除列 |
dropDefaultValue | 删除默认值 |
dropForeignKeyConstraint | 删除某一外键约束 |
dropNotNullConstraint | 删除空值约束 |
dropPrimaryKey | 删除主键 |
dropProcedure | 删除存储过程 |
dropSequence | 删除序列 |
dropTable | 删除表 |
dropUniqueConstraint | 删除唯一约束 |
dropView | 删除视图 |
(4) rename
标签 | 说明 |
---|---|
renameColumn | 重命名列 |
renameSequence | 重命名序列 |
renameTable | 重命名表 |
renameView | 重命名视图 |
5、sql
标签 | 说明 |
---|---|
sql | sql语句 |
sqlFile | sql文件 |
6、其他
标签 | 说明 |
---|---|
insert | 插入数据 |
update | 更新数据 |
delete | 删除数 |
empty | 空操作 |
executeCommand | 执行命名 |
alterSequence | 修改序列 |
customChange | 自定义操作,需自己实现 |
loadData | 导入csv数据至已存在的表中 |
loadUpdateData | 导入csv数据至表中,表不存在则新建 |
mergeColumns | 合并列 |
modifyDataType | 修改数据类型 |
output | 输出日志 |
setColumnRemarks | 增加列说明 |
setTableRemarks | 增加表说明 |
stop | 停止liquibase |
tagDatabase | 打标签用于将来回滚 |
5、集成Maven插件
(1) 在pom.xml中加入下面的插件配置
<build><plugins><plugin><groupId>org.liquibase</groupId><artifactId>liquibase-maven-plugin</artifactId><configuration><!--properties文件路径,该文件记录了数据库连接信息等--><propertyFile>src/main/resources/liquibase.properties</propertyFile><propertyFileWillOverride>true</propertyFileWillOverride><!--生成文件的路径--><outputChangeLogFile>src/main/resources/liquibase/change/changelog_base.xml</outputChangeLogFile></configuration></plugin></plugins></build>
(2) 在resources目录下加入liquibase.properties配置文件
#要连接库配置信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/qbb01
username=root
password=root
#liquibase
changeLogFile=src/main/resources/liquibase/db.changelog-master.xml