如何在应用程序启动时运行 SQL 脚本并获取数据?

新手上路,请多包涵

我正在开发一个 Spring Boot 应用程序。目前我的一些配置是硬编码的(例如 Hystrix 属性)。

所以我想在我的应用程序启动时间或之后获得这些配置。

是否可以使用 Spring Boot 做到这一点?我的意思是在启动时运行 SQL 脚本并获取数据。

应该如何在我的应用程序中检索和存储属性/配置?

我正在使用 MyBatis 和 Oracle DB。

原文由 Laurynas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 766
2 个回答

默认情况下,Spring-Boot 加载 data.sql 和/或 data-${platform}.sql

但是,请记住,脚本会在每次启动时加载,所以我认为(至少对于生产而言)更有意义(至少对于生产而言),让数据库中已经存在的值,而不是在每次启动时重新插入。 在使用内存数据库时,我个人仅将数据库初始化用于测试/开发目的。 不过,这是 Spring-Boot 提供的功能。

来源: spring-boot-howto-database-initialization

Spring JDBC 有一个 DataSource 初始化器特性。 Spring Boot 默认启用它并从标准位置 schema.sql 和 data.sql(在类路径的根目录中)加载 SQL。此外,Spring Boot 将加载 schema-\({platform}.sql 和 data-\){platform}.sql 文件(如果存在)。

src/main/resources/ data-oracle.sql:

 insert into...
insert into...

  • 您可以使用以下方式定义平台: spring.datasource.platform=oracle
  • 您可以更改要加载的 sql 脚本的名称: spring.datasource.data=myscript.sql
  • 随着 data.sql ,Spring-boot 还加载 schema.sql (在 data.sql 之前)。
  • 您还可以在 data.sql 中包含“更新或插入”逻辑: oracle sql: update if exists else insert

原文由 alexbt 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果要在启动后从 sql 脚本加载数据,请使用 ResourceDatabasePopulator 类对象,如下所示。

 import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;

import javax.sql.DataSource;

@Component
public class InitializeData {

    @Autowired
    private DataSource dataSource;

    @EventListener(ApplicationReadyEvent.class)
    public void loadData() {
            ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(false, false, "UTF-8", new ClassPathResource("data.sql"));
        resourceDatabasePopulator.execute(dataSource);
    }
}

它将轻松地从 sql 文件中加载数据,并且不用担心 sql 文件中的错误 sql 语句,因为它会被忽略。

原文由 pjsagar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题