Play Framework JDBC support library providing database access, connection pooling, and database configuration management for Play applications.
npx @tessl/cli install tessl/maven-com-typesafe-play--play-jdbc-2-11@2.7.0Play JDBC is the database access module for the Play Framework, providing comprehensive database connectivity through both Scala and Java APIs. It offers connection pooling via HikariCP, transaction management, database configuration support, and utilities for database operations in Play applications.
libraryDependencies += "com.typesafe.play" %% "play-jdbc" % "2.7.9"Scala API:
import play.api.db._
import java.sql.Connection
import javax.sql.DataSource
import javax.inject.InjectJava API:
import play.db.*;
import java.sql.Connection;
import javax.sql.DataSource;
import javax.inject.Inject;import play.api.db._
import java.sql.Connection
import javax.inject.Inject
class UserController @Inject()(db: Database) {
def getUser(id: Long) = {
db.withConnection { implicit connection =>
// Execute SQL queries
val stmt = connection.prepareStatement("SELECT name FROM users WHERE id = ?")
stmt.setLong(1, id)
val rs = stmt.executeQuery()
if (rs.next()) Some(rs.getString("name")) else None
}
}
def createUser(name: String) = {
db.withTransaction { implicit connection =>
val stmt = connection.prepareStatement("INSERT INTO users (name) VALUES (?)")
stmt.setString(1, name)
stmt.executeUpdate()
}
}
}import play.db.*;
import javax.inject.Inject;
public class UserController {
private final Database db;
@Inject
public UserController(Database db) {
this.db = db;
}
public Optional<String> getUser(long id) {
return db.withConnection(connection -> {
PreparedStatement stmt = connection.prepareStatement("SELECT name FROM users WHERE id = ?");
stmt.setLong(1, id);
ResultSet rs = stmt.executeQuery();
return rs.next() ? Optional.of(rs.getString("name")) : Optional.empty();
});
}
public void createUser(String name) {
db.withTransaction(connection -> {
PreparedStatement stmt = connection.prepareStatement("INSERT INTO users (name) VALUES (?)");
stmt.setString(1, name);
stmt.executeUpdate();
});
}
}Play JDBC is organized around several key components:
Core database connectivity providing connection management, transaction support, and resource handling for both Scala and Java APIs.
trait Database {
def name: String
def dataSource: DataSource
def getConnection(): Connection
def withConnection[A](block: Connection => A): A
def withTransaction[A](block: Connection => A): A
}public interface Database {
String getName();
DataSource getDataSource();
Connection getConnection();
<A> A withConnection(ConnectionCallable<A> block);
void withTransaction(ConnectionRunnable block);
}API for managing multiple database configurations in a single application, with named database support.
trait DBApi {
def databases(): Seq[Database]
def database(name: String): Database
def shutdown(): Unit
}public interface DBApi {
List<Database> getDatabases();
Database getDatabase(String name);
void shutdown();
}HikariCP-based connection pool implementation with comprehensive configuration options and performance monitoring.
trait ConnectionPool {
def create(name: String, dbConfig: DatabaseConfig, configuration: Config): DataSource
def close(dataSource: DataSource): Unit
}Type-safe configuration system supporting multiple databases, JNDI, and environment-specific settings.
case class DatabaseConfig(
driver: Option[String],
url: Option[String],
username: Option[String],
password: Option[String],
jndiName: Option[String]
)Runtime and compile-time dependency injection modules with support for named databases and lifecycle management.
class DBModule extends SimpleModule
trait DBComponents {
def dbApi: DBApi
}@NamedDatabase("users")
@Inject
private Database userDb;sealed abstract class TransactionIsolationLevel(val id: Int)
object TransactionIsolationLevel {
case object ReadUncommitted extends TransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED)
case object ReadCommitted extends TransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED)
case object RepeatedRead extends TransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ)
case object Serializable extends TransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)
}public enum TransactionIsolationLevel {
ReadUncommitted(Connection.TRANSACTION_READ_UNCOMMITTED),
ReadCommitted(Connection.TRANSACTION_READ_COMMITTED),
RepeatedRead(Connection.TRANSACTION_REPEATABLE_READ),
Serializable(Connection.TRANSACTION_SERIALIZABLE);
}
@FunctionalInterface
public interface ConnectionCallable<A> {
A call(Connection connection) throws SQLException;
}
@FunctionalInterface
public interface ConnectionRunnable {
void run(Connection connection) throws SQLException;
}