This article covers how to define a Datasource resource programmatically using the DataSourceDefinition annotation. Then, we will show to to use the Datasource to connect to a Relational Database and execute SQL Statements.
A Datasource object is an interface to a Relational Database. It is commonly used in Enterprise applications to fetch Connections from a pool of active database connections.
A Datasource is also an Enterprise resource, therefore you can use the @Resource annotation to reference a Datasource available in your configuration:
@Resource(lookup="java:jboss/datasources/ExampleDS") private DataSource ds;
However, for testing purposes, it is convenient to define a Datasource object programmatically through the @DatasourceDefinition annotation.
The following example shows how to define a DataSourceDefinition and use a Datasource which connects to an H2 Database and execute some SQL Statements:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.annotation.Resource;
import jakarta.annotation.sql.DataSourceDefinition;
import jakarta.ejb.Singleton;
import jakarta.ejb.Startup;
import jakarta.inject.Inject;
import javax.sql.DataSource;
@DataSourceDefinition (
className="org.hsqldb.jdbcDriver",
name = "java:global/datasource/sampledb",
user="sa",
password="",
databaseName="sampledb",
properties = {"connectionAttributes=;create=true"},
url = "jdbc:hsqldb:mem:sampledb"
)
@Singleton
@Startup
public class LoadDatabase {
@Resource(lookup="java:global/datasource/sampledb")
private DataSource dataSource;
@PostConstruct
public void init() {
executeSQL(dataSource, "CREATE TABLE Publisher (id INT NOT NULL, title VARCHAR(50) NOT NULL, author VARCHAR(20) NOT NULL, submission_date DATE) ");
}
@PreDestroy
public void destroy() {
try {
executeSQL(dataSource, "DROP TABLE IF EXISTS Publisher");
} catch (Exception e) {
}
}
private void executeSQL(DataSource dataSource, String query) {
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(query)) {
statement.executeUpdate();
}
} catch (SQLException e) {
// do nothing
}
}
}
This sample Class is a @Startup Bean so the Application Server will load it at start up. More about the @Startup Service here: How to create an EJB Startup Service