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

2022-09-01 09:18:40

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

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

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

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

我正在使用MyBatis和Oracle DB。


答案 1

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

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

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

Spring JDBC 有一个 DataSource 初始值设定项功能。默认情况下,Spring Boot 启用它,并从标准位置架构.sql和数据.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.sqlschema.sqldata.sql
  • 您还可以在数据中具有“更新或插入”逻辑.sql:oracle sql:如果存在,则更新,否则插入

答案 2

对我有用的是使用:DataSourceInitializer

@Bean
public DataSourceInitializer dataSourceInitializer(@Qualifier("dataSource") final DataSource dataSource) {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
    dataSourceInitializer.setDataSource(dataSource);
    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
    return dataSourceInitializer;
}

用于在初始化期间设置数据库,在销毁期间清理数据库。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/init/DataSourceInitializer.html


推荐