【数据库系列】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 都能够帮助开发者有效管理数据库的演变,使得开发过程更加高效和可靠。

相关推荐
程序猿 董班长20 小时前
springboot配置多数据源(mysql、hive)
hive·spring boot·mysql
huazhixuthink20 小时前
PostgreSQL三种关闭方式的区别
数据库·postgresql
B1118521Y461 天前
flask的使用
后端·python·flask
阿里小阿希1 天前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
且行志悠1 天前
Mysql的使用
mysql
xuxie131 天前
SpringBoot文件下载(多文件以zip形式,单文件格式不变)
java·spring boot·后端
白鹭1 天前
MySQL源码部署(rhel7)
数据库·mysql
重生成为编程大王1 天前
Java中的多态有什么用?
java·后端
666和7771 天前
Struts2 工作总结
java·数据库
还听珊瑚海吗1 天前
SpringMVC(一)
数据库