Spring Boot集成liquibase快速入门Demo

1.什么是liquibase?

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决方案,通过执行 schema 类型的文件来达到迁移。

Liquibase 特性

  • 支持几乎所有主流的数据库,如 MySQL, PostgreSQL, Oracle, Sql Server, DB2 等;

  • 支持多开发者的协作维护;

  • 日志文件支持多种格式,如 XML, YAML, JSON, SQL等;

  • 支持上下文相关逻辑

  • 生成数据库变更文档

  • 支持多种运行方式,如命令行、Spring 集成、Maven 插件、Gradle 插件等。

2.环境准备

version: '3'services:  mysql:    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7    container_name: mysql_3306    restart: unless-stopped    volumes:      - "./mysql/my.cnf:/etc/mysql/my.cnf"      - "./mysql/init-file.sql:/etc/mysql/init-file.sql"      - "./mysql/data:/var/lib/mysql"#      - "./mysql/conf.d:/etc/mysql/conf.d"      - "./mysql/log/mysql/error.log:/var/log/mysql/error.log"      - "./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" # init sql script directory -- tips: it can be excute  when `/var/lib/mysql` is empty    environment:                        # set environment,equals docker run -e      TZ: Asia/Shanghai      LANG: en_US.UTF-8      MYSQL_ROOT_PASSWORD: root         # set root password      MYSQL_DATABASE: root              # init database name    ports:                              # port mappping      - "3306:3306"

注意my.cnf在windows系统必须为只读,否则忽略

docker-compose -f docker-compose.yml -p mysql57 up -d

3.代码工程

实验目标

实验mysql数据初始化

pom.xml

<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">    <parent>        <groupId>org.springframework.bootgroupId>        <artifactId>spring-boot-starter-parentartifactId>        <version>3.2.1version>    parent>    <modelVersion>4.0.0modelVersion>
<artifactId>LiquibaseartifactId>
<properties> <maven.compiler.source>17maven.compiler.source> <maven.compiler.target>17maven.compiler.target> properties> <dependencies>

<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency>
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-autoconfigureartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-jdbcartifactId> dependency> <dependency> <groupId>org.liquibasegroupId> <artifactId>liquibase-coreartifactId> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>8.0.33version> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.liquibasegroupId> <artifactId>liquibase-maven-pluginartifactId> <configuration> <outputChangeLogFile>${basedir}/src/main/resources/liquibase/generate/changeLog.xmloutputChangeLogFile> <driver>com.mysql.jdbc.Driverdriver> <url>jdbc:mysql://localhost:3306/demo?useSSL=falseurl> <username>rootusername> <password>rootpassword> <dropFirst>falsedropFirst> <verbose>trueverbose> <logging>debuglogging> <promptOnNonLocalDatabase>falsepromptOnNonLocalDatabase> <outputFileEncoding>UTF-8outputFileEncoding> <propertyFileWillOverride>truepropertyFileWillOverride> configuration> plugin> plugins> build>project>

applocation.properties

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/demo?createDatabaseIfNotExist=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=falsespring.datasource.username = rootspring.datasource.password = rootspring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.liquibase.change-log = classpath:liquibase/master.xmlspring.liquibase.contexts = dev

changlog配置目录

也可以使用插件生成,如下图所示

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo(liquibase)

4.测试

启动Spring Boot应用程序,查看启动日志

2024-08-05T14:36:52.691+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelogDatabase is up to date, no changesets to execute2024-08-05T14:36:52.730+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelog2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : UPDATE SUMMARY2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Run: 02024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Previously run: 12024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Filtered out: 02024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : -------------------------------2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Total change sets: 12024-08-05T14:36:52.738+08:00 INFO 26572 --- [ main] liquibase.util : Update summary generated2024-08-05T14:36:52.755+08:00 INFO 26572 --- [ main] liquibase.lockservice : Successfully released change log lock2024-08-05T14:36:52.757+08:00 INFO 26572 --- [ main] liquibase.command : Command execution complete

因为我之前已经启动过一次,sql已经被执行了,所以第二次不会再执行。Liquibase默认会生成databasechangelog和databasechangeloglock表(记录变更日志)

5.引用

  • https://docs.liquibase.com/home.html

  • http://www.liuhaihua.cn/archives/711043.html

请使用浏览器的分享功能分享到微信等