JDBC
SeedStack JDBC add-on provides support for connection to any relational database through the JDBC API.
Dependency
<dependency>
<groupId>org.seedstack.addons.jdbc</groupId>
<artifactId>jdbc</artifactId>
</dependency>
Show version
dependencies {
compile("org.seedstack.addons.jdbc:jdbc:3.0.3")
}
A JDBC driver is also required in the classpath and depends upon the chosen database.
Configuration
Configuration is done by declaring one or more data-sources:
jdbc:
# Configured data-sources with the name of the data-source as key
datasources:
datasource1:
# The fully qualified class name of the data-source provider (see below, defaults to 'org.seedstack.jdbc.internal.datasource.PlainDataSourceProvider')
provider: (Class<? extends DataSourceProvider>)
# The fully qualified class name of the JDBC driver (automatically detected from url if not specified)
driver: (Class<? extends Driver>)
# The URL of the data-source
url: (String)
# The properties of the data-source (dependent on the driver)
properties:
property1: value1
# The username used to connect to the data-source (optional)
user: (String)
# The password used to connect to the data-source (optional)
password: (String)
# The fully qualified class name of the exception handler (optional)
exceptionHandler: (Class<? extends JdbcExceptionHandler>)
# When looking up the datasource through JNDI, the name of the data-source.
jndiName: (String)
# When looking up the datasource through JNDI, the context to do the lookup (use the default context if not specified)
jndiContext: (String)
# The name of the configured data-source to use if nothing is specified in the '@Jdbc' annotation
defaultDatasource: (String)
To dump the jdbc
configuration options:
mvn -q -Dargs="jdbc" seedstack:config
Examples
With Hikari pooling
The following YAML configures a data-source named datasource1
, using the Hikari connection pool
which is a very fast and reliable connection pool.
jdbc:
datasources:
datasource1:
provider: org.seedstack.jdbc.internal.datasource.HikariDataSourceProvider
url: jdbc:hsqldb:mem:testdb1
Note that the driver class name is automatically detected according to the URL. The Hikari dependency will be needed:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.5.1</version>
</dependency>
dependencies {
compile("com.zaxxer:HikariCP:2.5.1")
}
JNDI lookup
When a JNDI name is specified, the provider
, url
, properties
, user
and password
configuration options
are ignored.
jdbc:
datasources:
datasource1:
jndiName: java:comp/env/jdbc/my-datasource
The jndiContext
configuration option is needed only when you want to do the lookup in a non-default JNDI context.
Usage
The following examples show how to get a JDBC connection.
public class MyRepository {
@Inject
private Connection connection;
@Transactional
@Jdbc("datasource1")
public void updateStuff(int id, String bar){
try{
String sql = "INSERT INTO FOO VALUES(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, bar);
statement.executeUpdate();
} catch(SqlException e){
throw new SomeRuntimeException(e, "message");
}
}
}
Any interaction with this connection have to be done inside a transaction. Refer to the transaction documentation for more detail.
Data source providers
Built-in
When using a non JNDI data-source, we recommend the use of a connection pool. This is done by specifying a class
implementing the DataSourceProvider
interface. The built-in providers are:
- HikariCP with
HikariDataSourceProvider
- Commons DBCP with
DbcpDataSourceProvider
- C3P0 with
C3p0DataSourceProvider
- A test-only, do-nothing, plain data-source provider with
PlainDataSourceProvider
. Do not use in production.
To use a connection pool, add its dependency on the classpath. Each connection pool must be configured according to its documentation.
Custom
In the case you want to use another data source provider, you can create your own DataSourceProvider
by implementing
the DataSourceProvider
interface:
public class SomeDataSourceProvider implements DataSourceProvider {
@Override
public DataSource provideDataSource(String driverClass, String url, String user, String password, Properties jdbcProperties) {
// TODO: build the data-source and return it
}
}
To use it, just specify the fully qualified name of the class in the provider
configuration option.