2016-06-19 7 views
0

In this Play tutorialこれには、データベースにアクセスするための例を含め、JDBC接続プールの使用方法が説明されています。問題は、デフォルトのデータベースをdbフィールドに割り当てる方法が明確でないことです。例えばScalaのPlayでデフォルトのJDBCデータベースにアクセスする

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

} 

私はこの方法でデシベル宣言の代わりに、クラス・パラメータを置くが、意図は同じです。

注:私はあなたがdocumentationを見てたとき、あなたはあなたのコントローラに(application.confで構成された)デフォルトのDBを注入する方法を見ることができます2.5.2

+0

この例では、注入することができます。この行を見てください。 'class ScalaControllerInject @Inject()(db:Database)extends Controller' –

+0

問題は、' val x = new ScalaControllerInject() 'でクラスをインスタンス化すると、エラーがスローされます。データベース 'をパラメータとして使用し、パラメータに何を入れるべきかわかりません。 – ps0604

+0

なぜこのクラスをインスタンス化しますか? Guiceはそれを作成し、すべての依存関係を提供します。 –

答えて

3

を再生使用しています。

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インスタンスをアクションで使用できます。

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

アプリケーションの設定で複数のDBを設定する場合は、NamedDatabase注釈が適切なものを注入に使用することができます。

輸入javax.inject.Inject 輸入play.api.db. {データベース、NamedDatabase} 輸入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

@注入はコントローラでのみ動作しますか?非コントローラクラスで自分のデータベースを使用したいのですが? 'クラスWorksWithDB(データベース:データベース){...}'その後、そのクラスのインスタンスを作成するときに、コンストラクタの前に@Inject()があるかどうかにかかわらず、データベースのインスタンスをフィードしなければなりません。ない。 – NateH06

+0

これは、DIエンジンによって管理されているもので動作します。関連するドキュメントを見てください – cchantep

+0

私はそれらの束を見てきましたが、私は何を求めているのでしょうか、それを注入せずにクラスのアプリケーションのデフォルトデータベースを取得する方法はありますか? – NateH06

1

は、私は会話の中であることを探していたものを見つけ受け入れられた答えのコメントにあった。注射を使用したくない場合は、この方法でデータベースに接続することもできます。あなたのSBT .buildは、あなたが持っているデータベースと適切なJDBCドライバに合わせて設定する必要があります。しかし、あなたは、その後、どんなクラスで使用すると、データ・ベースを使用することを持っている場合、あなたが持って確認してください。

import play.api.db.Databases

、その後、次のことができます。

class ExampleClass { 

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

そして、これはあなたをできるようになりますそうでない場合はtestDbオブジェクトを使用します。

関連する問題