Spring Boot 中加载初始数据

举报
千锋教育 发表于 2023/07/19 13:48:18 2023/07/19
【摘要】 我们已经使用Hibernate、Flyway 或 Liquibase初始化了数据库模式。然而,除了架构之外,我们还经常需要应用程序在运行时所需的某些数据。例如,这可以是一个表Country,其中存储了 ISO 代码和货币。Spring Boot 应用程序中有哪些可用选项?使用 ApplicationRunnerAnApplicationRunner在我们的 Spring Boot 应用程序启...

Spring Boot 中加载初始数据.jpg

我们已经使用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.sqlresourcesDataSource该脚本将由 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 迁移脚本 _

这三种方式都是初始化数据的有效选项 - 因此请根据您自己的喜好进行选择。只是应该避免多种方式的并行使用。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。