Spring Boot 中加载初始数据
我们已经使用Hibernate、Flyway 或 Liquibase初始化了数据库模式。然而,除了架构之外,我们还经常需要应用程序在运行时所需的某些数据。例如,这可以是一个表Country
,其中存储了 ISO 代码和货币。Spring Boot 应用程序中有哪些可用选项?
使用 ApplicationRunner
AnApplicationRunner
在我们的 Spring Boot 应用程序启动后立即执行。ApplicationRunners
如果应用程序中有多个,也可以使用 来按所需顺序对它们进行排序@Order
。
@Component
public class CountryLoader implements ApplicationRunner {
private final CountryRepository countryRepository;
@Autowired
public CountryLoader(final CountryRepository countryRepository) {
this.countryRepository = countryRepository;
}
public void run(final ApplicationArguments args) {
if (countryRepository.count() != 0) {
return;
}
final Country germany = new Country();
germany.setCode("DE");
germany.setCurrency("EUR");
countryRepository.save(germany);
final Country states = new Country();
states.setCode("US");
states.setCurrency("USD");
countryRepository.save(states);
}
}
使用ApplicationRunner初始化数据
此选项提供了最高的灵活性,因为可以在我们的应用程序中直接控制该过程。
使用数据.sql
如果我们使用关系数据库,我们可以简单地将 a 放在文件夹data.sql
中resources
。DataSource
该脚本将由 Spring Boot 根据启动期间的配置自动执行。
INSERT INTO country (code, currency) VALUES ('DE', 'EUR') ON CONFLICT DO NOTHING;
INSERT INTO country (code, currency) VALUES ('US', 'USD') ON CONFLICT DO NOTHING;
PostgreSQL 的特殊插入脚本
我们必须确保这些值不会被多次创建。如果我们的数据库模式是由 Hibernate 创建的,我们还应该添加以下属性,以便仅在 Hibernate 进行更改后运行我们的脚本。
spring:
jpa:
defer-datasource-initialization: true
在 Hibernate 之后运行 data.sql
使用变更日志
如果我们选择 Flyway 或 Liquibase 来生成模式,我们也可以使用它们来加载我们的初始数据。它们隐式地确保对连接的数据库执行更改一次。
对于 Liquibase,我们只需将另一个具有更高时间戳的变更日志添加到我们的changelogs
文件夹中即可。
databaseChangeLog:
- changeSet:
id: countries-initial
author: bootify.io
changes:
- insert:
tableName: country
columns:
- column:
name: code
value: DE
- column:
name: currency
value: EUR
- insert:
tableName: country
columns:
- column:
name: code
value: US
- column:
name: currency
stringValue: USD
resources/changelogs/2023-01-18_11-00.yml 中的 Liquibase 变更日志
对于 Flyway,我们直接使用所用数据库的方言创建迁移脚本。我们将其存储起来,resources/db/migration/V002__INITIAL_COUNTRIES.sql
以便在创建表结构后立即执行。
INSERT INTO country (code, currency) VALUES ('DE', 'EUR');
INSERT INTO country (code, currency) VALUES ('US', 'USD');
_ Flyway 迁移脚本 _
这三种方式都是初始化数据的有效选项 - 因此请根据您自己的喜好进行选择。只是应该避免多种方式的并行使用。
- 点赞
- 收藏
- 关注作者
评论(0)