【问题标题】:Accessing the default JDBC database in Play for Scala在 Play for Scala 中访问默认的 JDBC 数据库
【发布时间】:2016-06-19 04:36:06
【问题描述】:

In this Play tutorial解释了如何使用JDBC连接池,包括一个访问数据库的例子。问题是不清楚如何将默认数据库分配给db 字段。

例如:

class ScalaControllerInject @Inject() extends Controller {

  def index = Action {
    var outString = "Number is "

    val db: Database = ??? // How to assign the default database to db?

    val conn = db.getConnection()

    try {
      val stmt = conn.createStatement
      val rs = stmt.executeQuery("SELECT 9 as testkey ")

      while (rs.next()) {
        outString += rs.getString("testkey")
      }
    } finally {
      conn.close()
    }
    Ok(outString)
  }

}

我把db声明放在了方法中,而不是类参数中,但是意图是一样的。

注意:我使用的是 Play 2.5.2

【问题讨论】:

  • 该示例显示您可以将其注入。看这行class ScalaControllerInject @Inject()(db: Database) extends Controller
  • 问题是如果我用val x = new ScalaControllerInject() 实例化类,它会抛出一个错误,说我需要将Database 指定为参数,我不知道在参数中放什么.
  • 为什么要实例化这个类? Guice 将创建它并提供所有依赖项。
  • 谢谢,我现在明白了

标签: scala playframework playframework-2.5


【解决方案1】:

当您查看documentation 时,您可以看到如何在您的控制器中注入默认数据库(在application.conf 中配置)。

import javax.inject.Inject

import play.api.Play.current
import play.api.mvc._
import play.api.db._

class ScalaControllerInject @Inject()(db: Database) extends Controller {
  // ...
}

注意类声明,其中@Inject() 后面是注入参数列表。

那么db实例就可以在actions中使用了。

db.withConnection { con: java.sql.Connection =>
  doSomethingWith(con)
}

如果您在应用程序设置中配置了多个数据库,则可以使用NamedDatabase 注解注入正确的数据库。

导入 javax.inject.Inject 导入 play.api.db.{ 数据库,命名数据库 } 导入 play.api.mvc.Controller

// inject "orders" database instead of "default"
class ScalaInjectNamed @Inject()(
  @NamedDatabase("orders") db: Database) extends Controller {

  // do whatever you need with the db
}

【讨论】:

  • @Inject 是否仅适用于控制器?如果我想在非控制器类中使用我的数据库怎么办? class WorksWithDB( db : Database) { ... } 然后,当我创建该类的实例时,我必须为其提供一个数据库实例,无论构造函数前面是否有 @Inject()。
  • 它适用于由 DI 引擎管理的内容。查看相关文档
  • 我已经经历了很多,但我猜我在问什么,有没有办法从一个类中获取应用程序的默认数据库而不注入它?
  • 只有DI加载的组件才能通过这种方式注入依赖:playframework.com/documentation/2.6.x/…
【解决方案2】:

我在已接受答案的 cmets 中的对话中找到了我正在寻找的内容。如果您不想使用注入,也可以通过这种方式连接到数据库。您的 SBT .build 必须配置为您拥有的数据库和正确的 JDBC 驱动程序。但是,如果你有这个,那么在你想使用数据库的任何类中,确保你有:

import play.api.db.Databases

然后你可以:

class ExampleClass {

  val testDb = Databases(
    driver = "org.postgresql.Driver",
    url = "postgres://dbUserName:password@localhost:port#/name_of_db"
  )

这将允许您像其他方式一样使用testDb 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多