播放:获取到默认数据库的连接

Play: obtaining a connection to the default database

我想获得与我在 application.conf:

中编写时定义的数据库实例的连接
db.default {
  driver = "com.mysql.jdbc.Driver"
  url = "jdbc:mysql://localhost/test"
  username = ...
  password = ...
}

docs 说我们应该将 db: Database 注入控制器(工作正常), 没有其他方式 。预定义的 Guice 注入是隐藏的(不在 Module.scala 中)。它还表明默认数据库单例由 Play 自动创建。

如果我不想将数据库注入控制器,而是将关注点分开并仅在某些 SqlHandler 对象中使用它,唯一的工作就是执行 SQL 查询怎么办:

object SqlHandler {
  val db: Database = ???
  def select(params) {...db...}
  def insert(params) {...db...}
}

我知道我可以用 play.api.db.Databases 创建一个新的数据库实例,比如

import play.api.db.Databases
val db: Database = Databases(
  driver = "com.mysql.jdbc.Driver"
  url = "jdbc:mysql://localhost/test"
  username = ...
  password = ...
)

但我不仅觉得重复所有信息很愚蠢,而且我相信它还会创建两次数据库(一次是自动的,一次是手动的,不是吗?)。

是否有任何方便的方法来获得与我的默认数据库的连接,或者我如何我可以使用 Guice 将它注入其他地方?

此答案假定您要将 SqlHandler 注入控制器。

如果是这样,您可以在控制器中执行此操作:-

class Application @Inject() (sql: SqlHandler) extends Controller {

  def index = Action { implicit request =>
    ...    
    sql.someSQLHandlerBehaviour()
    ...
  }
}

由于控制器是由 Guice 开箱即用地管理的,因此任何可注入对象也将属于 Guice 生命周期管理的范围。所以你应该能够像上面那样将你的 SqlHandler 注入控制器。

并且由于您的 SqlHandler 现在由 Guice 管理,您可以像这样将 jdbc 依赖项注入 SqlHandler

@Singleton
class SqlInjector @Inject() (db: Database) { ... }