在不使用XMLconfiguration的情况下初始化数据库,但使用@Configuration
我想知道如何初始化一个数据库,而不必创build一个XML文件。
我已经使用这种初始化工作正常,但在我目前的情况下,我不想创build一个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>
我知道我可以创build一个embedded式数据库:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); EmbeddedDatabase db = builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql").build();
就我而言,数据库和模式是使用Liquibase创build的。
我只想用Spring和我的自定义数据集进行初始化,而不必每次都创build一个新的XML文件。
可能吗?
您的@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; }
您必须创build自己的schema.sql
并将其放在src/main/resources
-folder中。
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; } }
在查看与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方法而不是在Springconfiguration。
这当然是可能的。
如果你已经有了一个由Spring的ApplicationContext
加载的@Configuration
类,那么你只需创build一个新的@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(); }