我想知道如何在不创建XML文件的情况下初始化数据库。
我已经使用了这种工作正常的初始化,但在我目前的情况下,我不想创建XML:
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
<jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>
我知道我可以创建一个嵌入式数据库:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql").build();
在我的例子中,数据库和模式是使用Liquibase创建的。
我只想用Spring和我的自定义数据集初始化它,而不必每次都为此创建一个新的XML文件。
有可能吗?
答案 0 :(得分:34)
@Configuration
类中的以下代码行可能有效。
@Value("classpath:com/foo/sql/db-schema.sql")
private Resource schemaScript;
@Value("classpath:com/foo/sql/db-test-data.sql")
private Resource dataScript;
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
final DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
initializer.setDatabasePopulator(databasePopulator());
return initializer;
}
private DatabasePopulator databasePopulator() {
final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(schemaScript);
populator.addScript(dataScript);
return populator;
}
答案 1 :(得分:25)
您必须创建自己的schema.sql
并将其放在src/main/resources
- 文件夹中。
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
@Configuration
public class DataSourceInitializer {
@Bean(name = "dataSource")
public DataSource getDataSource(){
DataSource dataSource = createDataSource();
DatabasePopulatorUtils.execute(createDatabasePopulator(), dataSource);
return dataSource;
}
private DatabasePopulator createDatabasePopulator() {
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
databasePopulator.setContinueOnError(true);
databasePopulator.addScript(new ClassPathResource("schema.sql"));
return databasePopulator;
}
private SimpleDriverDataSource createDataSource() {
SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
simpleDriverDataSource.setUrl("jdbc:h2:target/database/example;AUTO_RECONNECT=TRUE");
simpleDriverDataSource.setUsername("");
simpleDriverDataSource.setPassword("");
return simpleDriverDataSource;
}
}
答案 2 :(得分:6)
当然有可能。
如果您已经有一个由@Configuration
加载的ApplicationContext
类,那么您只需要创建一个包含代码的新@Bean
方法已经存在(当然还有return
声明。)
EmbeddedDatabase
实现了DataSource
界面,因此可以轻松地与JdbcTemplate
一起使用。
@Bean
public DataSource db() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql");
return builder.build();
}
答案 3 :(得分:6)
在查看与EmbeddedDatabaseBuilder相关的Spring类之后,我发现DatabaseBuilder使用的代码如下所示:
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
for (String sqlScript: sqlInitializationScripts ) {
Resource sqlScriptResource = RESOURCE_LOADER.getResource(sqlScript);
populator.addScript(sqlScriptResource);
}
DatabasePopulatorUtils.execute(populator, dataSource);
这对我来说很好,即使它是在@BeforeTest方法而不是在Spring配置上。