2016-06-19 4 views
0

In this Play tutorial Es wird erläutert, wie Sie einen JDBC-Verbindungspool verwenden, einschließlich eines Beispiels für den Zugriff auf die Datenbank. Problem ist, dass es nicht klar ist, wie die Standarddatenbank dem Feld db zugewiesen wird.Zugriff auf die Standard-JDBC-Datenbank in Play für Scala

Zum Beispiel:

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) 
    } 

} 

Ich habe die DB-Deklaration in der Methode anstelle der Klassenparametern, aber die Absicht ist das gleiche.

Hinweis: Ich verwende Wiedergabe 2.5.2

+0

Das Beispiel zeigt, dass Sie es injizieren können. Sehen Sie sich diese Zeile 'class ScalaControllerInject @Inject() (db: Database) erweitert Controller' –

+0

Problem ist, dass, wenn ich die Klasse mit 'val x = new ScalaControllerInject()' instanziiere es eine Fehlermeldung, dass ich die' Datenbank als Parameter, und ich weiß nicht, was ich in den Parameter eingeben soll. – ps0604

+0

Warum würden Sie diese Klasse instanziieren? Guice wird es erstellen und alle Abhängigkeiten bereitstellen. –

Antwort

3

Wenn Sie einen Blick auf die documentation haben, können Sie sehen, wie die Standard-DB (konfiguriert in application.conf) in Ihrem Controller zu injizieren.

import javax.inject.Inject 

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

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

Achten Sie darauf, auf die Klassendeklaration, wo @Inject() durch die Liste der injizierten Argumente folgen.

Dann kann die db Instanz in den Aktionen verwendet werden.

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

Wenn Sie mehr als eine DB in den Anwendungseinstellungen konfigurieren, kann die NamedDatabase Anmerkung inject die richtigen eine verwendet werden.

Import javax.inject.Inject Import play.api.db. {Database, NamedDatabase} Import 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 
} 
+0

funktioniert das @Inject nur mit einem Controller? Was ist, wenn ich meine Datenbank in einer Nicht-Controller-Klasse verwenden möchte? 'Klasse WorksWithDB (db: Database) {...}' Wenn ich dann eine Instanz dieser Klasse erstelle, muss ich ihr eine Instanz der Datenbank geben, unabhängig davon, ob vor dem Konstruktor ein @Inject() steht oder nicht nicht. – NateH06

+0

Es funktioniert für was von der DI-Engine verwaltet wird. Werfen Sie einen Blick auf die verwandten Dokumente – cchantep

+0

Ich habe eine Reihe von ihnen durchlaufen, aber ich denke, was ich frage, gibt es einen Weg, um die Standard-Datenbank der Anwendung von einer Klasse zu bekommen, ohne es zu injizieren? – NateH06

1

fand ich, was ich in dem Gespräch gesucht wird hatte in den Kommentaren der angenommenen Antwort. Sie können auf diese Weise auch eine Verbindung zu einer Datenbank herstellen, wenn Sie keine Injektion verwenden möchten. Ihr SBT .build muss für die Datenbank, die Sie haben, und den richtigen JDBC-Treiber konfiguriert werden. Aber, wenn Sie das haben, dann in welcher Klasse Sie die Datenbank verwenden möchten, sollten Sie haben:

import play.api.db.Databases

und dann können Sie:

class ExampleClass { 

    val testDb = Databases(
    driver = "org.postgresql.Driver", 
    url = "postgres://dbUserName:[email protected]:port#/name_of_db" 
) 

Und das wird es Ihnen ermöglichen, um das Objekt testDb wie sonst zu verwenden.