【数据库系列】Liquibase 在 Spring Boot 中的使用--详细介绍

Liquibase 是一个强大的数据库版本控制工具,能够帮助开发者管理和追踪数据库结构和数据的变更。通过与 Spring Boot

的集成,Liquibase 提供了便捷的数据库迁移和版本控制功能。本文将通过多个丰富的示例,详细讲解如何在 Spring Boot

项目中使用 Liquibase。

1. 项目准备

1.1 创建 Spring Boot 项目

访问 Spring Initializr 创建新的 Spring Boot 项目,选择以下依赖项:

  • Spring Web
  • Spring Data JPA
  • MySQL Driver(或其他数据库驱动)
  • Liquibase Migration

下载并解压缩生成的项目。

1.2 添加 Maven 依赖

pom.xml 中,确保添加 Liquibase 的依赖:

xml 复制代码
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>4.x.x</version> <!-- 使用最新版本 -->
</dependency>

同时确保包含 Spring Data JPA 和数据库驱动的依赖,例如 MySQL:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

1.3 配置数据库连接

src/main/resources/application.properties 中配置数据库连接信息:

properties 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/my_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=my_user
spring.datasource.password=my_password
spring.jpa.hibernate.ddl-auto=none
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml

2. 示例 1:创建用户表

2.1 创建变更日志文件

src/main/resources/db/changelog 目录下创建一个变更日志文件 db.changelog-master.xml,并定义用户表的创建。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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-4.3.xsd">

    <changeSet id="1" author="authorName">
        <createTable tableName="users">
            <column name="id" type="int">
                <constraints primaryKey="true" autoIncrement="true"/>
            </column>
            <column name="name" type="varchar(100)">
                <constraints nullable="false"/>
            </column>
            <column name="email" type="varchar(100)">
                <constraints unique="true"/>
            </column>
            <column name="created_at" type="timestamp">
                <constraints nullable="false" defaultValueComputed="CURRENT_TIMESTAMP"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

2.2 启动应用程序

运行应用程序:

bash 复制代码
mvn spring-boot:run

2.3 验证结果

使用数据库管理工具检查 my_database,确认 users 表已成功创建。

sql 复制代码
SHOW TABLES; -- 查看数据库中的所有表
SELECT * FROM users; -- 查看 users 表

3. 示例 2:添加列和修改列类型

3.1 修改变更日志文件

db.changelog-master.xml 中添加新的变更集,用于向 users 表添加 age 列并修改 name 列的类型。

xml 复制代码
<changeSet id="2" author="authorName">
    <addColumn tableName="users">
        <column name="age" type="int"/>
    </addColumn>
</changeSet>

<changeSet id="3" author="authorName">
    <modifyDataType tableName="users" columnName="name" newDataType="varchar(255)"/>
</changeSet>

3.2 再次启动应用程序

重新启动应用程序,Liquibase 会检测到新的变更集并应用。

bash 复制代码
mvn spring-boot:run

3.3 验证结果

使用数据库管理工具,检查 users 表,确认 age 列已经添加,并且 name 列的类型已更新。

sql 复制代码
DESCRIBE users; -- 查看 users 表的结构

4. 示例 3:创建订单表并添加外键约束

4.1 修改变更日志文件

db.changelog-master.xml 中添加新的变更集,用于创建 orders 表并添加外键约束。

xml 复制代码
<changeSet id="4" author="authorName">
    <createTable tableName="orders">
        <column name="id" type="int">
            <constraints primaryKey="true" autoIncrement="true"/>
        </column>
        <column name="user_id" type="int"/>
        <column name="product" type="varchar(100)">
            <constraints nullable="false"/>
        </column>
        <column name="quantity" type="int">
            <constraints nullable="false"/>
        </column>
        <column name="order_date" type="timestamp">
            <constraints defaultValueComputed="CURRENT_TIMESTAMP"/>
        </column>
        <foreignKeyConstraint baseTableName="orders" baseColumnNames="user_id"
            referencedTableName="users" referencedColumnNames="id" 
            constraintName="fk_user_id"/>
    </createTable>
</changeSet>

4.2 启动应用程序

再次运行应用程序:

bash 复制代码
mvn spring-boot:run

4.3 验证结果

使用数据库管理工具检查 my_database,确认 orders 表已成功创建,并且 user_id 列与 users 表的 id 列建立了外键关系。

sql 复制代码
SHOW TABLES; -- 查看数据库中的所有表
SELECT * FROM orders; -- 查看 orders 表

5. 示例 4:数据填充

5.1 创建数据填充变更集

db.changelog-master.xml 中添加一个新的变更集,用于插入初始数据。

xml 复制代码
<changeSet id="5" author="authorName">
    <insert tableName="users">
        <column name="name" value="John Doe"/>
        <column name="email" value="john@example.com"/>
        <column name="age" value="30"/>
    </insert>
    <insert tableName="users">
        <column name="name" value="Jane Smith"/>
        <column name="email" value="jane@example.com"/>
        <column name="age" value="25"/>
    </insert>
</changeSet>

5.2 启动应用程序

再次启动应用程序,Liquibase 会自动将数据插入 users 表。

bash 复制代码
mvn spring-boot:run

5.3 验证结果

检查 users 表,确认数据已正确插入。

sql 复制代码
SELECT * FROM users; -- 查看 users 表中的数据

6. 示例 5:回滚变更

6.1 添加回滚操作

db.changelog-master.xml 中,您可以为变更集添加回滚操作。例如,为创建 users 表的变更集添加回滚逻辑:

xml 复制代码
<changeSet id="1" author="authorName">
    <createTable tableName="users">
        <column name="id" type="int">
            <constraints primaryKey="true" autoIncrement="true"/>
        </column>
        <column name="name" type="varchar(100)">
            <constraints nullable="false"/>
        </column>
        <column name="email" type="varchar(100)">
            <constraints unique="true"/>
        </column>
        <column name="created_at" type="timestamp">
            <constraints nullable="false" defaultValueComputed="CURRENT_TIMESTAMP"/>
        </column>
    </createTable>
    <rollback>
        <dropTable tableName="users"/>
    </rollback>
</changeSet>

6.2 执行回滚

如果需要回滚到之前的状态,可以使用以下命令:

bash 复制代码
mvn liquibase:rollback -Dliquibase.rollbackCount=1

6.3 验证回滚结果

运行回滚命令后,使用数据库管理工具确认 users 表已被删除。

sql 复制代码
SHOW TABLES; -- 查看数据库中的所有表

7. 示例 6:使用 YAML 配置文件

除了 XML,Liquibase 还支持使用 YAML 格式的变更日志。以下是一个使用 YAML 的示例。

7.1 创建 YAML 变更日志文件

src/main/resources/db/changelog 目录下创建一个名为 db.changelog-master.yaml 的文件:

yaml 复制代码
databaseChangeLog:
  - changeSet:
      id: 1
      author: authorName
      changes:
        - createTable:
            tableName: users
            columns:
              - column:
                  name: id
                  type: int
                  constraints:
                    primaryKey: true
                    autoIncrement: true
              - column:
                  name: name
                  type: varchar(100)
                  constraints:
                    nullable: false
              - column:
                  name: email
                  type: varchar(100)
                  constraints:
                    unique: true
              - column:
                  name: created_at
                  type: timestamp
                  constraints:
                    nullable: false
                    defaultValueComputed: CURRENT_TIMESTAMP

7.2 更新配置

application.properties 中更新 spring.liquibase.change-log 的路径:

properties 复制代码
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml

7.3 启动应用程序

再次启动应用程序,Liquibase 会根据 YAML 配置创建 users 表。

bash 复制代码
mvn spring-boot:run

8. 总结

通过以上丰富的示例,我们展示了如何在 Spring Boot 项目中使用 Liquibase 进行数据库版本控制和变更管理。Liquibase 提供了灵活的变更集机制,支持创建表、修改列、填充数据、回滚变更等多种操作。无论是使用 XML 还是 YAML 格式,Liquibase 都能够帮助开发者有效管理数据库的演变,使得开发过程更加高效和可靠。

相关推荐
月光水岸New40 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67541 分钟前
数据库基础1
数据库
我爱松子鱼44 分钟前
mysql之规则优化器RBO
数据库·mysql
闲猫1 小时前
go orm GORM
开发语言·后端·golang
丁卯4041 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo1 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Tirzano2 小时前
springsecurity自定义认证
spring boot·spring
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql