锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Spring Boot集成liquibase快速入门Demo

Spring Boot集成liquibase快速入门Demo

0
  • 软件开发
  • 发布于 2024-08-16
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

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 系统必须为只读,否则忽略

<?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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
 
    <artifactId>Liquibase</artifactId>
 
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
 
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <configuration>
                    <!--生成Changelog的输出目录-->
                    <outputChangeLogFile>${basedir}/src/main/resources/liquibase/generate/changeLog.xml</outputChangeLogFile>
                    <!--DB连接信息-->
                    <driver>com.mysql.jdbc.Driver</driver>
                    <url>jdbc:mysql://localhost:3306/demo?useSSL=false</url>
                    <username>root</username>
                    <password>root</password>
                    <dropFirst>false</dropFirst>
                    <verbose>true</verbose>
                    <logging>debug</logging>
                    <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                    <outputFileEncoding>UTF-8</outputFileEncoding>
                    <propertyFileWillOverride>true</propertyFileWillOverride>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3. 代码工程

实验目标

实验 mysql 数据初始化

pom.xml

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

applocation.properties

2024-08-05T14:36:52.691+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelog
Database is up to date, no changesets to execute
2024-08-05T14:36:52.730+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelog
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : UPDATE SUMMARY
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Run: 0
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Previously run: 1
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Filtered out: 0
2024-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: 1
2024-08-05T14:36:52.738+08:00 INFO 26572 --- [ main] liquibase.util : Update summary generated
2024-08-05T14:36:52.755+08:00 INFO 26572 --- [ main] liquibase.lockservice : Successfully released change log lock
2024-08-05T14:36:52.757+08:00 INFO 26572 --- [ main] liquibase.command : Command execution complete

changlog 配置目录

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

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

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(liquibase)

4. 测试

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

2024-08-05T14:36:52.691+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelog
Database is up to date, no changesets to execute
2024-08-05T14:36:52.730+08:00 INFO 26572 --- [ main] liquibase.changelog : Reading from demo.databasechangelog
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : UPDATE SUMMARY
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Run: 0
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Previously run: 1
2024-08-05T14:36:52.737+08:00 INFO 26572 --- [ main] liquibase.util : Filtered out: 0
2024-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: 1
2024-08-05T14:36:52.738+08:00 INFO 26572 --- [ main] liquibase.util : Update summary generated
2024-08-05T14:36:52.755+08:00 INFO 26572 --- [ main] liquibase.lockservice : Successfully released change log lock
2024-08-05T14:36:52.757+08:00 INFO 26572 --- [ main] liquibase.command : Command execution complete

因为我之前已经启动过一次,sql 已经被执行了,所以第二次不会再执行。

Liquibase 默认会生成 databasechangelog 和 databasechangeloglock 表(记录变更日志)

5. 引用

  • Liquibase Documentation
  • Spring Boot 集成 liquibase 快速入门 Demo | Harries Blog™
标签: #软件开发 1171 #JAVA 991 #Spring Boot 173
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.