在 Spring Boot 项目里进行数据库迁移,其目的是保证数据库结构在不同环境和版本间保持一致,同时能顺利升级或回滚数据库。下面为你介绍几种常用的数据库迁移工具及其使用方法。

Flyway

Flyway 是一款简单易用的数据库迁移工具,它借助版本化的 SQL 脚本管理数据库变更。

步骤

  1. 添加依赖:在 pom.xml 里添加 Flyway 的依赖。
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
  1. 配置 Flyway:在 application.properties 或者 application.yml 中配置 Flyway。
spring.flyway.enabled=true
spring.flyway.url=jdbc:mysql://localhost:3306/your_database
spring.flyway.user=your_username
spring.flyway.password=your_password
  1. 创建迁移脚本:在 src/main/resources/db/migration 目录下创建 SQL 脚本,文件名需遵循 V<版本号>__<描述>.sql 的格式,例如 V1__Create_users_table.sql
-- V1__Create_users_table.sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE
);
  1. 运行迁移:启动 Spring Boot 应用程序,Flyway 会自动检测并执行未执行过的迁移脚本。

Liquibase

Liquibase 是一个强大的数据库重构和迁移工具,支持 XML、YAML、JSON 和 SQL 格式的迁移脚本。

步骤

  1. 添加依赖:在 pom.xml 中添加 Liquibase 的依赖。
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
</dependency>
  1. 配置 Liquibase:在 application.properties 或者 application.yml 中配置 Liquibase。
spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml
  1. 创建迁移脚本:在 src/main/resources/db/changelog 目录下创建主变更日志文件 db.changelog-master.yaml,并在其中引用其他变更日志文件。
# db.changelog-master.yaml
databaseChangeLog:
  - include:
      file: db.changelog-1.0.yaml

db.changelog-1.0.yaml 中编写具体的迁移脚本。

# db.changelog-1.0.yaml
databaseChangeLog:
  - changeSet:
      id: 1
      author: you
      changes:
        - createTable:
            tableName: users
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: email
                  type: varchar(255)
                  constraints:
                    nullable: false
                    unique: true
  1. 运行迁移:启动 Spring Boot 应用程序,Liquibase 会自动检测并执行未执行过的迁移脚本。

Spring Boot Data JPA 的 Schema Generation

若项目使用 Spring Boot Data JPA,可借助 JPA 的 spring.jpa.hibernate.ddl-auto 属性进行数据库迁移。

步骤

  1. 配置 JPA:在 application.properties 或者 application.yml 中配置 JPA 的 ddl-auto 属性。
spring.jpa.hibernate.ddl-auto=update

ddl-auto 有以下几种取值:

  • create:每次启动应用时都会创建新的数据库表,会删除原有的表。
  • create-drop:启动时创建表,关闭应用时删除表。
  • update:依据实体类的变化更新数据库表结构。
  • validate:验证实体类和数据库表结构是否一致,若不一致则抛出异常。
  • none:不进行任何表结构的修改。
  1. 定义实体类:创建 JPA 实体类,JPA 会依据实体类的定义生成数据库表结构。
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

总结

  • Flyway:操作简单,适合简单项目,以 SQL 脚本管理数据库变更。
  • Liquibase:功能强大,支持多种格式的迁移脚本,适合复杂项目。
  • Spring Boot Data JPA 的 Schema Generation:适合快速开发和测试环境,不适用于生产环境的数据库迁移。