此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Boot 3.5.5spring-doc.cadn.net.cn

数据库初始化

SQL 数据库可以通过不同的方式初始化,具体取决于堆栈是什么。 当然,您也可以手动执行此作,前提是数据库是一个单独的进程。 建议使用单一机制进行架构生成。spring-doc.cadn.net.cn

使用 Hibernate 初始化数据库

您可以设置spring.jpa.hibernate.ddl-auto来控制 Hibernate 的数据库初始化。 支持的值包括none,validate,update,createcreate-drop. Spring Boot 会根据您是否使用嵌入式数据库为您选择默认值。 通过查看Connectiontype 和 JDBC url。hsqldb,h2derby是嵌入式数据库,而其他数据库则不是。 如果识别了嵌入式数据库,并且未检测到模式管理器(Flyway 或 Liquibase),则ddl-auto默认为create-drop. 在所有其他情况下,它默认为none.spring-doc.cadn.net.cn

从内存中切换到“真实”数据库时要小心,不要对新平台中表和数据的存在做出假设。 您必须将ddl-auto显式或使用其他机制之一来初始化数据库。spring-doc.cadn.net.cn

您可以通过启用org.hibernate.SQL记录。 如果启用调试模式,则会自动为您完成此作。

此外,一个名为import.sql如果 Hibernate 从头开始创建模式(即,如果ddl-auto属性设置为createcreate-drop). 如果您小心的话,这对于演示和测试很有用,但您可能不希望在生产中的类路径上使用。 这是 Hibernate 功能(与 Spring 无关)。spring-doc.cadn.net.cn

使用基本 SQL 脚本初始化数据库

Spring Boot 可以自动创建 JDBC 的模式(DDL 脚本)DataSource或 R2DBCConnectionFactory并初始化其数据(DML 脚本)。spring-doc.cadn.net.cn

默认情况下,它从optional:classpath*:schema.sql以及来自optional:classpath*:data.sql. 这些架构和数据脚本的位置可以使用spring.sql.init.schema-locationsspring.sql.init.data-locations分别。 这optional:前缀表示即使文件不存在,应用程序也会启动。 要使应用程序在文件不存在时无法启动,请删除optional:前缀。spring-doc.cadn.net.cn

此外,Spring Boot 处理optional:classpath*:schema-${platform}.sqloptional:classpath*:data-${platform}.sql文件(如果存在),其中${platform}spring.sql.init.platform. 这允许您在必要时切换到特定于数据库的脚本。 例如,您可以选择将其设置为数据库的提供商名称 (hsqldb,h2,oracle,mysql,postgresql,依此类推)。spring-doc.cadn.net.cn

默认情况下,仅在使用嵌入式内存数据库时执行 SQL 数据库初始化。 要始终初始化 SQL 数据库,无论其类型如何,请将spring.sql.init.modealways. 同样,要禁用初始化,请将spring.sql.init.modenever. 默认情况下,Spring Boot 启用其基于脚本的数据库初始值设定项的故障快速功能。 这意味着,如果脚本导致异常,则应用程序无法启动。 您可以通过设置spring.sql.init.continue-on-error.spring-doc.cadn.net.cn

基于脚本DataSource缺省情况下,在任何 JPA 之前执行初始化EntityManagerFactorybean 被创建。schema.sql可用于为 JPA 管理的实体创建模式,并且data.sql可用于填充它。 虽然我们不建议使用多个数据源初始化技术,但如果您想要基于脚本DataSourceinitialization 以便能够基于 Hibernate 执行的模式创建进行构建,将spring.jpa.defer-datasource-initializationtrue. 这会将数据源初始化推迟到任何EntityManagerFactorybean 已创建并初始化。schema.sql然后可用于对 Hibernate 执行的任何模式创建进行添加,并且data.sql可用于填充它。spring-doc.cadn.net.cn

初始化脚本支持单行注释和块注释。不支持其他注释格式。--/* */

如果您使用的是更高级别的数据库迁移工具,例如 Flyway 或 Liquibase,则应单独使用它们来创建和初始化架构。使用基本的schema.sqldata.sql不建议将脚本与 Flyway 或 Liquibase 一起使用,并且将在将来的版本中删除支持。spring-doc.cadn.net.cn

如果您需要使用更高级别的数据库迁移工具初始化测试数据,请参阅有关 FlywayLiquibase 的部分。spring-doc.cadn.net.cn

初始化 Spring Batch 数据库

如果您使用 Spring Batch,它预打包了适用于大多数流行数据库平台的 SQL 初始化脚本。Spring Boot 可以检测您的数据库类型并在启动时执行这些脚本。如果您使用嵌入式数据库,则默认情况下会发生这种情况。您还可以为任何数据库类型启用它,如以下示例所示:spring-doc.cadn.net.cn

spring.batch.jdbc.initialize-schema=always
spring:
  batch:
    jdbc:
      initialize-schema: "always"

您还可以通过设置spring.batch.jdbc.initialize-schemanever.spring-doc.cadn.net.cn

使用更高级别的数据库迁移工具

Spring Boot 支持两个更高级别的迁移工具:FlywayLiquibasespring-doc.cadn.net.cn

启动时执行 Flyway 数据库迁移

要在启动时自动运行 Flyway 数据库迁移,请将相应的 Flyway 模块添加到您的类路径中。内存中和基于文件的数据库由以下人员支持org.flywaydb:flyway-core. 否则,需要特定于数据库的模块。例如,使用org.flywaydb:flyway-database-postgresql使用 PostgreSQL 和org.flywaydb:flyway-mysql使用 MySQL。有关更多详细信息,请参阅 Flyway 文档spring-doc.cadn.net.cn

通常,迁移是格式为V<VERSION>__<NAME>.sql(与<VERSION>下划线分隔的版本,例如“1”或“2_1”)。默认情况下,它们位于名为classpath:db/migration,但您可以通过将spring.flyway.locations. 这是一个或多个以逗号分隔的列表classpath:filesystem:地点。 例如,以下配置将在默认类路径位置和/opt/migration目录:spring-doc.cadn.net.cn

spring.flyway.locations=classpath:db/migration,filesystem:/opt/migration
spring:
  flyway:
    locations: "classpath:db/migration,filesystem:/opt/migration"

您还可以添加特殊的{vendor}占位符以使用特定于提供商的脚本。 假设以下情况:spring-doc.cadn.net.cn

spring.flyway.locations=classpath:db/migration/{vendor}
spring:
  flyway:
    locations: "classpath:db/migration/{vendor}"

而不是使用db/migration,前面的配置根据数据库的类型(例如db/migration/mysql对于 MySQL)。 支持的数据库列表可在DatabaseDriver.spring-doc.cadn.net.cn

迁移也可以用 Java 编写。 Flyway 将自动配置为实现JavaMigration.spring-doc.cadn.net.cn

FlywayProperties提供了 Flyway 的大部分设置和一小部分附加属性,可用于禁用迁移或关闭位置检查。 如果您需要对配置进行更多控制,请考虑注册FlywayConfigurationCustomizer豆。spring-doc.cadn.net.cn

Spring Boot 调用Flyway.migrate()以执行数据库迁移。 如果您想要更多控制权,请提供@Bean实现FlywayMigrationStrategy.spring-doc.cadn.net.cn

Flyway 支持 SQL 和 Java 回调。 要使用基于 SQL 的回调,请将回调脚本放在classpath:db/migration目录。 要使用基于 Java 的回调,请创建一个或多个实现Callback. 任何此类 bean 都会自动注册到Flyway. 可以使用以下命令订购它们@Order或通过实现Ordered.spring-doc.cadn.net.cn

默认情况下,Flyway 会自动连接 (@Primary) DataSource并将其用于迁移。 如果您喜欢使用不同的DataSource,您可以创建一个并标记其@Bean@FlywayDataSource. 如果您这样做并想要两个数据源(例如,通过保留主自动配置DataSource),记得将defaultCandidate属性的@Bean注释到false. 或者,您可以使用 Flyway 的原生DataSource通过设置spring.flyway.[url,user,password]在外部属性中。 将spring.flyway.urlspring.flyway.user足以使 Flyway 使用自己的DataSource. 如果尚未设置三个属性中的任何一个,则其等效属性的值spring.datasource属性将被使用。spring-doc.cadn.net.cn

您还可以使用 Flyway 为特定场景提供数据。 例如,可以将特定于测试的迁移放在src/test/resources并且它们仅在应用程序启动进行测试时运行。 此外,还可以使用特定于配置文件的配置来自定义spring.flyway.locations以便某些迁移仅在特定配置文件处于活动状态时运行。 例如,在application-dev.properties,您可以指定以下设置:spring-doc.cadn.net.cn

spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration
spring:
  flyway:
    locations: "classpath:/db/migration,classpath:/dev/db/migration"

通过该设置,迁移dev/db/migration仅当dev配置文件处于活动状态。spring-doc.cadn.net.cn

启动时执行 Liquibase 数据库迁移

要在启动时自动运行 Liquibase 数据库迁移,请将org.liquibase:liquibase-core到你的类路径。spring-doc.cadn.net.cn

当您添加org.liquibase:liquibase-core对于您的类路径,数据库迁移默认在应用程序启动期间和测试运行之前运行。 可以使用spring.liquibase.enabled属性,在maintest配置。 不可能使用两种不同的方法来初始化数据库(例如,用于应用程序启动的 Liquibase,用于测试运行的 JPA)。spring-doc.cadn.net.cn

默认情况下,主更改日志是从db/changelog/db.changelog-master.yaml,但您可以通过设置spring.liquibase.change-log. 除了 YAML 之外,Liquibase 还支持 JSON、XML 和 SQL 更改日志格式。spring-doc.cadn.net.cn

默认情况下,Liquibase 会自动连接 (@Primary) DataSource并将其用于迁移。 如果您需要使用不同的DataSource,您可以创建一个并标记其@Bean@LiquibaseDataSource. 如果您这样做并想要两个数据源(例如,通过保留主自动配置DataSource),记得将defaultCandidate属性的@Bean注释到false. 或者,您可以使用 Liquibase 的原生DataSource通过设置spring.liquibase.[driver-class-name,url,user,password]在外部属性中。 将spring.liquibase.urlspring.liquibase.user足以使 Liquibase 使用自己的DataSource. 如果尚未设置三个属性中的任何一个,则其等效属性的值spring.datasource属性将被使用。spring-doc.cadn.net.cn

LiquibaseProperties了解有关可用设置(如上下文、默认架构等)的详细信息。spring-doc.cadn.net.cn

您还可以使用Customizer<Liquibase>bean 如果要自定义Liquibase实例。spring-doc.cadn.net.cn

使用 Flyway 进行仅测试迁移

如果要创建填充测试数据库的 Flyway 迁移,请将它们放在src/test/resources/db/migration. 名为src/test/resources/db/migration/V9999__test-data.sql将在生产迁移后执行,并且仅在运行测试时执行。 您可以使用此文件创建所需的测试数据。 此文件不会打包在您的 uber jar 或容器中。spring-doc.cadn.net.cn

使用 Liquibase 进行仅测试迁移

如果要创建填充测试数据库的 Liquibase 迁移,则必须创建一个测试变更日志,其中还包括生产变更日志。spring-doc.cadn.net.cn

首先,您需要将 Liquibase 配置为在运行测试时使用不同的变更日志。 一种方法是创建一个 Spring Boottestprofile 并将 Liquibase 属性放入其中。 为此,请创建一个名为src/test/resources/application-test.properties并将以下属性放入其中:spring-doc.cadn.net.cn

spring.liquibase.change-log=classpath:/db/changelog/db.changelog-test.yaml
spring:
  liquibase:
    change-log: "classpath:/db/changelog/db.changelog-test.yaml"

这会将 Liquibase 配置为在test轮廓。spring-doc.cadn.net.cn

现在在src/test/resources/db/changelog/db.changelog-test.yaml:spring-doc.cadn.net.cn

databaseChangeLog:
  - include:
      file: classpath:/db/changelog/db.changelog-master.yaml
  - changeSet:
      runOrder: "last"
      id: "test"
      changes:
        # Insert your changes here

此更新日志将在运行测试时使用,并且不会打包在您的 uber jar 或容器中。 它包括生产变更日志,然后声明一个新的变更集,其runOrder: last设置指定它在运行所有生产变更集后运行。 例如,您现在可以使用插入变更集来插入数据,或使用 sql 变更集直接执行 SQL。spring-doc.cadn.net.cn

最后要做的是配置 Spring Boot 以激活test配置文件。 为此,您可以添加@ActiveProfiles("test")注释到你的@SpringBootTest带注释的测试类。spring-doc.cadn.net.cn

依赖于初始化的数据库

数据库初始化是在应用程序启动时执行的,作为应用程序上下文刷新的一部分。为了允许在启动期间访问初始化的数据库,将自动检测充当数据库初始值设定项的 Bean 和需要该数据库已初始化的 Bean。其初始化依赖于已初始化的数据库的 Bean 被配置为依赖于初始化它的 Bean。如果在启动期间,应用程序尝试访问数据库,但尚未初始化数据库,那么可以配置对初始化数据库并要求数据库已初始化的 Bean 的其他检测。spring-doc.cadn.net.cn

检测数据库初始值设定项

Spring Boot 将自动检测初始化 SQL 数据库的以下类型的 bean:spring-doc.cadn.net.cn

如果您将第三方Starters用于数据库初始化库,它可能会提供一个检测器,以便也自动检测其他类型的 bean。要检测其他 bean,请注册DatabaseInitializerDetectorMETA-INF/spring.factories.spring-doc.cadn.net.cn

检测依赖于数据库初始化的 Bean

Spring Boot将自动检测以下类型的bean,这些bean取决于数据库初始化:spring-doc.cadn.net.cn

如果您使用的是第三方入门数据访问库,它可能会提供一个检测器,以便也会自动检测其他类型的 bean。 要检测其他 bean,请注册DependsOnDatabaseInitializationDetectorMETA-INF/spring.factories. 或者,注释 bean 的类或其@Bean方法@DependsOnDatabaseInitialization.spring-doc.cadn.net.cn