Je voudrais savoir comment initialiser une base de données sans avoir à créer un fichier XML.
J'utilise déjà ce type d'initialisation qui fonctionne bien, mais dans mon cas actuel, je ne veux pas créer de 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>
Je sais que je peux créer une base de données intégrée avec:
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql").build();
Dans mon cas, la base de données et le schéma sont créés à l'aide de Liquibase.
Je veux juste l'initialiser avec Spring et avec mon jeu de données personnalisé, sans avoir à créer un nouveau fichier XML à chaque fois juste pour ça.
C'est possible?
Après avoir regardé les classes Spring liées à EmbeddedDatabaseBuilder, j'ai découvert que DatabaseBuilder utilise du code ressemblant à ceci:
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
for (String sqlScript: sqlInitializationScripts ) {
Resource sqlScriptResource = RESOURCE_LOADER.getResource(sqlScript);
populator.addScript(sqlScriptResource);
}
DatabasePopulatorUtils.execute(populator, dataSource);
Cela fonctionnera bien pour moi, même si ce sera sur une méthode @BeforeTest et non sur la configuration Spring.
Les lignes de code suivantes dans votre @Configuration
la classe pourrait fonctionner.
@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;
}
Vous devez créer votre propre schema.sql
et mettez-le dans votre src/main/resources
-dossier.
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;
}
}
C'est certainement possible.
Si vous avez déjà un @Configuration
classe en cours de chargement par ApplicationContext
de Spring, il vous suffit de créer un nouveau @Bean
méthode qui contiendra le code que vous y avez déjà (avec une instruction return
supplémentaire bien sûr).
EmbeddedDatabase
implémente l'interface DataSource
, donc elle peut facilement être utilisée avec les JdbcTemplate
.
@Bean
public DataSource db() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql");
return builder.build();
}