Testcontainers JDBC driver that provides lightweight, throwaway database instances for testing
npx @tessl/cli install tessl/maven-org-testcontainers--jdbc@1.21.0Testcontainers JDBC provides a JDBC driver proxy that automatically provisions Docker containers running database engines for testing purposes. It handles JDBC URLs with the 'jdbc:tc:' prefix, automatically launching appropriate database containers and routing connections to them, enabling developers to write integration tests against real database instances in isolated, reproducible environments.
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>jdbc</artifactId>
<version>1.21.3</version>
</dependency>import org.testcontainers.jdbc.ContainerDatabaseDriver;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.containers.JdbcDatabaseContainerProvider;
import org.testcontainers.jdbc.ConnectionUrl;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;
import org.testcontainers.jdbc.ConnectionWrapper;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseTest {
public void testWithJdbcUrl() throws SQLException {
// The JDBC URL automatically provisions a MySQL container
String jdbcUrl = "jdbc:tc:mysql:8.0.33://localhost/testdb?TC_INITSCRIPT=init.sql";
try (Connection connection = DriverManager.getConnection(jdbcUrl)) {
// Use the connection - container is automatically managed
// Container will be stopped when all connections are closed
}
}
}Testcontainers JDBC is built around several key components:
ContainerDatabaseDriver intercepts JDBC connections and manages container lifecycleJdbcDatabaseContainer provides database-agnostic container operationsJdbcDatabaseContainerProvider for database-specific implementationsConnectionUrl handles complex JDBC URL parsing and parameter extractionCore JDBC driver implementation that intercepts tc: URLs and manages database containers automatically.
public class ContainerDatabaseDriver implements java.sql.Driver {
public boolean acceptsURL(String url) throws SQLException;
public Connection connect(String url, Properties info) throws SQLException;
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException;
public int getMajorVersion();
public int getMinorVersion();
public boolean jdbcCompliant();
public Logger getParentLogger() throws SQLFeatureNotSupportedException;
// Utility methods for container management
public static void killContainers();
public static void killContainer(String jdbcUrl);
static JdbcDatabaseContainer getContainer(String jdbcUrl);
}Abstract base class for database containers that provide JDBC connectivity with lifecycle management and initialization support.
public abstract class JdbcDatabaseContainer<SELF extends JdbcDatabaseContainer<SELF>>
extends GenericContainer<SELF> implements LinkableContainer {
// Abstract methods that must be implemented
public abstract String getDriverClassName();
public abstract String getJdbcUrl();
public abstract String getUsername();
public abstract String getPassword();
protected abstract String getTestQueryString();
// Configuration methods
public SELF withUsername(String username);
public SELF withPassword(String password);
public SELF withDatabaseName(String dbName);
public SELF withUrlParam(String paramName, String paramValue);
public SELF withStartupTimeoutSeconds(int startupTimeoutSeconds);
public SELF withConnectTimeoutSeconds(int connectTimeoutSeconds);
public SELF withInitScript(String initScriptPath);
public SELF withInitScripts(String... initScriptPaths);
public SELF withInitScripts(Iterable<String> initScriptPaths);
// Connection methods
public Driver getJdbcDriverInstance() throws NoDriverFoundException;
public Connection createConnection(String queryString) throws SQLException, NoDriverFoundException;
public Connection createConnection(String queryString, Properties info) throws SQLException, NoDriverFoundException;
}Service provider interface for creating database-specific container implementations based on JDBC URL database types.
public abstract class JdbcDatabaseContainerProvider {
public abstract boolean supports(String databaseType);
public abstract JdbcDatabaseContainer newInstance(String tag);
public JdbcDatabaseContainer newInstance();
public JdbcDatabaseContainer newInstance(ConnectionUrl url);
protected JdbcDatabaseContainer newInstanceFromConnectionUrl(
ConnectionUrl connectionUrl,
String userParamName,
String pwdParamName
);
}Comprehensive URL parsing for JDBC connection strings with Testcontainers-specific parameters and database configuration.
public class ConnectionUrl {
public static ConnectionUrl newInstance(String url);
public static boolean accepts(String url);
// Getters for parsed components
public String getUrl();
public String getDatabaseType();
public Optional<String> getImageTag();
public String getDbHostString();
public boolean isInDaemonMode();
public Optional<String> getDatabaseHost();
public Optional<Integer> getDatabasePort();
public Optional<String> getDatabaseName();
public Optional<String> getInitScriptPath();
public boolean isReusable();
public Optional<InitFunctionDef> getInitFunction();
public Optional<String> getQueryString();
public Map<String, String> getContainerParameters();
public Map<String, String> getQueryParameters();
public Map<String, String> getTmpfsOptions();
}TC_INITSCRIPT - Path to SQL initialization script (classpath or file:// resource)TC_INITFUNCTION - Method reference for programmatic initialization (format: com.example.Class::method)TC_DAEMON - Keep container running across multiple connection cyclesTC_REUSABLE - Mark container for potential reuse across test runsTC_TMPFS - Configure tmpfs mounts for performance (format: path:options)Internal connection wrapper that provides lifecycle callbacks for container cleanup.
public class ConnectionWrapper extends ConnectionDelegate {
public ConnectionWrapper(Connection connection, Runnable closeCallback);
@Override
public void close() throws SQLException;
}Simple JDBC Connection delegate that forwards all calls to the underlying connection.
class ConnectionDelegate implements Connection {
// Implements all Connection interface methods via delegation
}JDBC-based database delegates for executing SQL scripts and statements.
public class JdbcDatabaseDelegate extends AbstractDatabaseDelegate<Statement> {
public JdbcDatabaseDelegate(JdbcDatabaseContainer container, String queryString);
@Override
protected Statement createNewConnection();
@Override
public void execute(String statement, String scriptPath, int lineNumber,
boolean continueOnError, boolean ignoreFailedDrops);
}
/**
* @deprecated Used only with deprecated ScriptUtils
*/
@Deprecated
public class ContainerLessJdbcDelegate extends JdbcDatabaseDelegate {
public ContainerLessJdbcDelegate(Connection connection);
@Override
protected Statement createNewConnection();
}Legacy SQL script utilities maintained for backward compatibility.
/**
* @deprecated Use database-agnostic ScriptUtils instead
*/
@Deprecated
public abstract class org.testcontainers.jdbc.ext.ScriptUtils {
public static final String DEFAULT_STATEMENT_SEPARATOR = ";";
public static final String FALLBACK_STATEMENT_SEPARATOR = "\n";
public static final String DEFAULT_COMMENT_PREFIX = "--";
public static final String DEFAULT_BLOCK_COMMENT_START_DELIMITER = "/*";
public static final String DEFAULT_BLOCK_COMMENT_END_DELIMITER = "*/";
public static void splitSqlScript(String resource, String script, String separator,
String commentPrefix, String blockCommentStartDelimiter,
String blockCommentEndDelimiter, List<String> statements);
public static boolean containsSqlScriptDelimiters(String script, String delim);
public static void executeSqlScript(Connection connection, String scriptPath, String script)
throws ScriptException;
public static void executeSqlScript(Connection connection, String scriptPath, String script,
boolean continueOnError, boolean ignoreFailedDrops,
String commentPrefix, String separator,
String blockCommentStartDelimiter,
String blockCommentEndDelimiter) throws ScriptException;
}public static class NoDriverFoundException extends RuntimeException {
public NoDriverFoundException(String message, Throwable cause);
}