我想在加载应用程序期间将一些数据加载到mysql数据库中。我正在使用Hibernate来管理应用程序的数据库。我可以通过使用Bootstrap在groovy中完成它,但我想用Java实现它。我想提一下,它是基于Spring MVC的Web应用程序。
在互联网上搜索时,我发现但是使用名为import_file的hibernate属性,我可以实现它,但我正在寻找替代路线。
答案 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
中