注:本系列教程花了三个星期的业余时间来翻译,虽然尽心尽力,但水平有限,难免有失误或表达不太好,请尽力地骂,骂完,可以打赏安慰我,我才有动力改。
源文档地址:https://docs.spring.io/spring-boot/docs/2.2.x/reference/html/howto.html#howto

10. 数据库初始化

可根据不同情况,以用不同的方式初始化SQL数据库。当然,如果数据库是一个单独的过程,您也可以手动执行。建议使用单一机制生成模式。

10.1. 使用JPA初始化数据库

JPA具有生成DDL的特性,可以将这些特性设置为在启动时针对数据库运行。这是通过两个外部属性控制的:

spring.jpa.generate-ddl (布尔值)打开和关闭功能,并且与供应商无关。

spring.jpa.hibernate.ddl-auto (枚举)是一个 Hibernate功能,它以更细粒度的方式控制行为。本指南稍后将详细介绍此功能。

10.2. 用Hibernate初始化数据库

可以显式设置spring.jpa.hibernate.ddl-auto,标准的hibernate属性值为none、validate、update、create和create drop。SpringBoot根据数据库是否嵌入的来为您选择一个默认值。默认情况下,如果没有检测到架构管理器,或者在所有其他情况下都没有,则create-drop。通过查看连接类型检测到嵌入的数据库。hsqldb、h2和derby是嵌入的,其他则不是。在从嵌入切换到“真实”数据库时要小心,不要对新平台中的表和数据的存在进行假设。您要么显式地设置DDL自动,要么使用其他机制之一初始化数据库。

您可以通过启用org.hibernate.sql记录器来输出模式创建。如果启用debug mode,将自动为您完成此操作。

此外,如果Hibernate从头开始创建架构(即,如果DDL Auto属性设置为createcreate drop),则在启动时执行类路径根目录中名为import.sql的文件。如果您小心的话,这对于演示和测试是有用的,但在生产中可能不是您想要的类路径。这是一个Hibernate功能(与Spring无关)。

10.3. 初始化一个数据库

SpringBoot可以自动创建数据源的模式(DDL脚本)并初始化它(DML脚本)。它分别从标准根类路径位置(schema.sqldata.sql)加载SQL。此外,Spring引导处理schema-${platform}.sqldata-${platform}.sql(如果存在),其中platform是spring.datasource.platform的值。这允许您在必要时切换到特定于数据库的脚本。例如,您可以选择将其设置为数据库的供应商名称(hsqldb、h2、oracle、mysql、postgresql等)。

SpringBoot自动创建嵌入数据源的架构。可以使用spring.datasource.initialization-mode属性自定义此行为。例如,如果要始终初始化数据源,而不考虑其类型:
spring.datasource.initialization-mode=always

默认情况下,SpringBoot启用SpringJDBC初始值设定项的fail fast特性。这意味着,如果脚本导致异常,应用程序将无法启动。您可以通过设置spring.datasource.continue-on-error来调整该行为。

在基于JPA的应用程序中,可以选择让Hibernate创建模式或使用schema.sql,但不能同时执行这两项操作。如果使用schema.sql,请确保禁用spring.jpa.hibernate.ddl-auto

10.4. 初始化Spring批处理数据库

如果您使用Spring批处理,它将与大多数流行数据库平台的SQL初始化脚本一起预打包。SpringBoot可以检测数据库类型并在启动时执行这些脚本。如果使用嵌入式数据库,则默认情况下会发生这种情况。您还可以为任何数据库类型启用它,如下例所示:

spring.batch.initialize-schema=always

也可以通过设置spring.batch.initialize-schema=never来显式关闭初始化。

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

SpringBoot支持两种高级迁移工具:FlywayLiquibase

10.5.1. 启动时执行Flyway数据库迁移

要在启动时自动运行flyway数据库迁移,请将org.flywaydb:flyway-core添加到类路径中。

迁移是以V<VERSION>__<NAME>.sql 的脚本(带有下划线分隔的<VERSION>,如“1”或“2_1”)。默认情况下,它们位于名为classpath:db/migration的文件夹中,但可以通过设置spring.flyway.locations来修改该位置。这是一个以逗号分隔的一个或多个classpath:或filesystem: 位置列表。例如,以下配置将在classpath:位置和/opt/migration目录中搜索脚本:

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

您还可以添加一个特殊的{vendor} 占位符以使用特定的脚本。假设如下:

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

前面的配置没有使用db/migration,而是根据数据库的类型(如db/migration/mysql for mysql)设置要使用的文件夹。DatabaseDriver中提供了支持的数据库列表。

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

spring boot调用flyway.migrate()来执行数据库迁移。如果您想要更多的控制,请提供一个@Bean来实现FlywayMigrationStrategy

Flyway 支持SQL和 Java回调。要使用基于SQL的回调,请将回调脚本放在classpath:db/migration文件夹中。要使用基于Java的回调,创建一个或多个实现回调的bean。任何这样的beans都会自动注册到Flyway。它们可以通过使用@Order或实现order进行排序。也可以检测到实现已弃用的FlywayCallback接口的bean,但是它们不能与回调bean一起使用。

默认的Flyway自动 注入@Primary数据源在你的环境,并用来迁移。如果你想使用一个不同的数据源,你可以创建一个标记并为 @FlywayDataSource@Bean 。如果您这样做并且需要两个数据源,请记住创建另一个数据源并将其标记为@primary。或者,您可以通过在外部属性中设置spring.flyway.[url,user,password]来使用Flyway的本机数据源。设置spring.flyway.url或spring.flyway.user足以使flyway使用自己的数据源。如果未设置这三个属性中的任何一个,则将使用其等效的spring.datasource属性的值。。

有一个有一个Flyway例子 例子 ,这样你可以看到如何设置东西。