Spring JDBC provides support for creating and managing embedded in-memory databases for development and testing purposes. Supported databases include H2, HSQLDB, and Derby.
Builder class for creating embedded databases with fluent API.
public class EmbeddedDatabaseBuilder {
// Constructors
public EmbeddedDatabaseBuilder() { }
public EmbeddedDatabaseBuilder(ResourceLoader resourceLoader) { }
// Configuration
public EmbeddedDatabaseBuilder setType(EmbeddedDatabaseType type) { }
public EmbeddedDatabaseBuilder setName(String databaseName) { }
public EmbeddedDatabaseBuilder generateUniqueName(boolean flag) { }
public EmbeddedDatabaseBuilder setDataSourceFactory(DataSourceFactory factory) { }
public EmbeddedDatabaseBuilder addScript(String script) { }
public EmbeddedDatabaseBuilder addScripts(String... scripts) { }
public EmbeddedDatabaseBuilder setScriptEncoding(String scriptEncoding) { }
public EmbeddedDatabaseBuilder setSeparator(String separator) { }
public EmbeddedDatabaseBuilder setCommentPrefix(String commentPrefix) { }
public EmbeddedDatabaseBuilder setCommentPrefixes(String... commentPrefixes) { }
public EmbeddedDatabaseBuilder setBlockCommentStartDelimiter(String blockCommentStartDelimiter) { }
public EmbeddedDatabaseBuilder setBlockCommentEndDelimiter(String blockCommentEndDelimiter) { }
public EmbeddedDatabaseBuilder setContinueOnError(boolean flag) { }
public EmbeddedDatabaseBuilder ignoreFailedDrops(boolean flag) { }
// Build
public EmbeddedDatabase build() { }
}public interface EmbeddedDatabase extends DataSource {
void shutdown();
}public enum EmbeddedDatabaseType {
H2,
HSQL,
DERBY
}import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
// Create H2 embedded database
EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setName("testdb")
.addScript("schema.sql")
.addScript("data.sql")
.build();
// Use database
JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
// Shutdown when done
db.shutdown();EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScripts(
"schema/tables.sql",
"schema/constraints.sql",
"schema/indexes.sql",
"data/users.sql",
"data/products.sql"
)
.build();EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setName("mydb")
.generateUniqueName(true) // Generate unique name
.setScriptEncoding("UTF-8")
.setSeparator(";")
.setCommentPrefix("--")
.setContinueOnError(false)
.ignoreFailedDrops(true)
.addScript("schema.sql")
.build();EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:schema-hsql.sql")
.addScript("classpath:test-data.sql")
.build();EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.DERBY)
.setName("derby-testdb")
.addScript("schema-derby.sql")
.build();@SpringJUnitConfig
public class DatabaseTest {
private EmbeddedDatabase db;
private JdbcTemplate jdbcTemplate;
@BeforeEach
public void setUp() {
db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.addScript("test-data.sql")
.build();
jdbcTemplate = new JdbcTemplate(db);
}
@AfterEach
public void tearDown() {
db.shutdown();
}
@Test
public void testQuery() {
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM users",
Integer.class
);
assertEquals(5, count);
}
}@Configuration
@Profile("test")
public class TestDatabaseConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setName("testdb")
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}ResourceLoader resourceLoader = new DefaultResourceLoader();
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(resourceLoader)
.setType(EmbeddedDatabaseType.H2);
// Add scripts dynamically
if (includeTestData) {
builder.addScript("schema.sql")
.addScript("test-data.sql");
} else {
builder.addScript("schema.sql");
}
EmbeddedDatabase db = builder.build();