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

时间:2016-10-16 21:31:33

标签: playframework-2.0

我希望获得与我在 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将其注入其他地方?

1 个答案:

答案 0 :(得分:0)

此答案假设您要将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) { ... }