我们已经使用Hibernate, Flyway or Liquibase初始化了数据库架构。但是,除了模式外,我们通常需要在运行时期间应用所需的某些数据。这可能是例如一个表Country
,其中存储ISO代码和货币。在Spring Boot应用程序中可以使用哪些选项?
使用应用程序设备
我们的Spring Boot应用程序开始后立即执行ApplicationRunner
。如果应用程序中有多个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初始化数据
此选项提供了最高的灵活性,因为该过程可以直接在我们的应用程序中控制。
。使用data.sql
如果我们正在使用关系数据库,则可以简单地将data.sql
放在resources
文件夹中。此脚本将由Spring Boot在启动期间针对配置的DataSource
自动执行。
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使用变频器
如果我们选择了用于生成模式的飞行或液体,我们还可以使用它们来加载我们的初始数据。他们暗中确保对连接数据库的更改精确执行。
在液体的情况下,我们只需在我们的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
- 资源/ChangElogs/2023-01-18_11-00中的liquibase changelog
在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迁移脚本_
所有三种方法都是有效的选项初始化我们的数据 - 因此,请根据自己的喜好选择。仅应避免使用多种方式并行使用。