如何在应用程序启动/加载期间执行SQL插入查询以填充数据库?

时间:2014-04-12 11:24:02

标签: java sql spring hibernate

我想在加载应用程序期间将一些数据加载到mysql数据库中。我正在使用Hibernate来管理应用程序的数据库。我可以通过使用Bootstrap在groovy中完成它,但我想用Java实现它。我想提一下,它是基于Spring MVC的Web应用程序。

在互联网上搜索时,我发现但是使用名为import_file的hibernate属性,我可以实现它,但我正在寻找替代路线。

4 个答案:

答案 0 :(得分:11)

你也可以利用Spring的DataSourceInitializer。以下是Java Config的示例。

@Bean
public DataSourceInitializer dataSourceInitializer() {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));

        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
        dataSourceInitializer.setDataSource(dataSource());
        dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
        return dataSourceInitializer;
    }

答案 1 :(得分:3)

Spring已经提供了一种使用DatabasePopulator初始化包含内容的数据库的方法。 对于Spring Batch示例应用程序,我找到了一个quick example。要在该代码中查看的类是ResourceDatabasePopulator。 Another example在Spring Social项目样本中。

答案 2 :(得分:2)

我会在Spring上下文配置中注册 ApplicationListener 的实例,该实例会侦听 ContextRefreshedEvent ,在应用程序上下文完成初始化或刷新时发出信号。在此之后,您可以设置数据库填充。

下面您将找到ApplicationListener实现(它依赖于负责执行数据库操作的DAO)和实现此目的所需的Spring配置(Java和XML)。您需要选择特定于您的应用的配置:

基于Java的配置

@Configuration
public class JavaConfig {

    @Bean
    public ApplicationListener<ContextRefreshedEvent> contextInitFinishListener() {
        return new ContextInitFinishListener(personRepository());
    }

    @Bean
    public PersonRepository personRepository() {
        return new PersonRepository();
    }
}

<强> XML

    <bean class="com.package.ContextInitFinishListener">
        <constructor-arg>
            <bean class="com.package.PersonRepository"/>
        </constructor-arg>
    </bean>

这是ContextInitFinishListener类的代码:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ContextInitFinishListener implements ApplicationListener<ContextRefreshedEvent> {

    private PersonRepository personRepository;

    public ContextInitFinishListener(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //populate database with required values, using PersonRepository
    }
}

注意:为了示例的目的,PersonRepository只是一个通用的DAO,它意味着代表您在应用中使用的DAO

答案 3 :(得分:0)

我在Spring Boot控制台应用程序测试中使用了以下内容。

ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
 rdp.addScript(new ClassPathResource("sql/create-tables.sql"));
 rdp.execute(dataSource);

根据应用程序类型或数据分层框架的类型,有多种获取数据源的方法。

如果您使用的是Spring Boot自动配置的h2数据源,则可以使用。

@Autowired
Datasource datasource;

通过下面的外部配置类获取数据源

@Value("${spring.datasource.driver-class-name}")
private String driverClass;

@Value("${spring.datasource.url}")
private String dbUrl;

@Value("${spring.datasource.username}")
private String dbUserName;

@Value("${spring.datasource.password}")
private String dbPassword;


@Bean
public DataSource dataSource(){
    SingleConnectionDataSource dataSource = new 
    SingleConnectionDataSource();
    dataSource.setDriverClassName(driverClass);
    dataSource.setUrl(dbUrl);
    dataSource.setUsername(dbUserName);
    dataSource.setPassword(dbPassword);
    dataSource.setSuppressClose(true);
    dataSource.setAutoCommit(true);
    return dataSource;
}

这对我有用,将您需要执行的所有查询保留在create-tables.sql