春天的靴子。运行SQL脚本并在应用程序启动时获取数据

时间:2016-09-01 20:26:23

标签: java spring spring-mvc spring-boot

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

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

使用弹簧靴可以做到吗?我的意思是在启动时运行SQL脚本并获取数据。

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

我正在使用MyBatis和Oracle DB。

7 个答案:

答案 0 :(得分:25)

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

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

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

  

Spring JDBC具有DataSource初始化程序功能。 Spring Boot启用   它默认情况下从标准位置schema.sql和加载SQL   data.sql(在类路径的根目录中)。另外Spring Boot会   加载模式 - $ {platform} .sql和data - $ {platform} .sql文件(如果   本)。

的src /主/资源/ 数据-oracle.sql:

insert into...
insert into...
  • 您可以使用以下代码定义平台:spring.datasource.platform=oracle
  • 您可以更改要加载的sql脚本的名称:spring.datasource.data=myscript.sql
  • data.sql一起,Spring-boot也会加载schema.sqldata.sql之前)。
  • 您还可以更新或插入" data.sql中的逻辑:oracle sql: update if exists else insert

答案 1 :(得分:2)

如果要在启动后从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语句错误,因为它将被忽略。

答案 2 :(得分:0)

如果要基于某些业务逻辑插入数据,我建议您使用事件监听器。因此,基本上在应用程序启动时,会自动调用使用@EventListener方法注释的“ OnApplicationEvent”。

就像您需要获取数据一样,您只需使用存储库对象来获取数据。

这里是一个例子:

@Component
public class OnApplicationStartUp {

   @Autowired
   private ServiceRepository repository;


   @EventListener
   public void onApplicationEvent(ContextRefreshedEvent event) {

       //Write your business logic here.
       if (repository.findAll().size() <= 0) {
           preloadData();
       }else{
           fetchData();
       }
   }

    private void preloadData() {

       List<Service> services = new ArrayList<>();
       Service someService= new Service("name", "type");
       services.add(someService);
       ...
       ...
       repository.saveAll(services);
   }
}

答案 3 :(得分:0)

如果从application.properties文件获取,则可以使用Environment类。 像这样

(?<=\S),(?=\S)

或者您可以定义自己的属性文件。那么你可以从中得到 Autowired private Environment environment; ... environment.getProperty("propertyName") 批注

您需要使用@Value批注从定义的属性文件中获取特定值。

@PropertySource(name = "myProperties", value = "example.properties")

并且您想在刚启动Application时启动一些东西,可以在方法之前使用它

@Value("${propertyNameInYourPropertFile}")
private String url;

但是需要使用@Service或@Component Annotation,该类具有该方法。

完全可以使用。

example.properties:

@EventListener(ApplicationReadyEvent.class)

示例类:

url=yourValue
userName=yourDBUserName
password=yourDBPassword

答案 4 :(得分:0)

对我有用的是使用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

答案 5 :(得分:0)

  1. 定义一个Spring Bean(例如GlobalConfigurationBean)
    范围:@Scope(scopeName = WebApplicationContext.SCOPE_APPLICATION)
    这个Bean负责在Bean初始化期间从数据库表中获取数据(保持配置属性)。

  2. 使用@PostConstruct注释方法。
    该方法具有从数据库表中获取配置参数的逻辑。

  3. 此bean的范围将确保仅从数据库表中获取所需的配置一次(例如,使用Hibernate查询或纯本机SQL),并且
    可用于同一应用程序中来自不同上下文的所有bean

现在,只需在希望使用那些配置属性或参数的位置注入此bean。

要么

使用:: Apache Commons DatabaseConfiguration <-
注意::它不支持缓存。但是我猜您不需要缓存,因为在应用程序启动时,数据库配置属性仅应加载一次。

要么

传统的旧方法:通过扩展“ PropertyPlaceHolderConfigurer”定义自定义实现,并将其定义为Spring Bean。
该实现应具有从配置表中获取数据库表中数据的逻辑。

答案 6 :(得分:0)

Initialize a Database using basic SQL scripts

仅使用基本的SQL脚本时,Spring Boot会自动创建嵌入式DataSource的架构。可以使用spring.datasource.initialization-mode属性来自定义此行为。例如,如果要始终初始化数据源,而不管其类型是什么:

spring.datasource.initialization-mode=always