Schritte zur Verwendung der MySQL-Datenbank mit Play Framework 2.0

91

Ich bin neu im Play Framework. Ich versuche, die MySQL-Datenbank als Datenquelle für Play Ebeans zu konfigurieren.

Könnten Sie bitte jemandem die Schritte erklären, die zum Konfigurieren von MySQL mit dem Play 2.0-Framework erforderlich sind (z. B. Herunterladen von Treibern, Hinzufügen von Abhängigkeiten usw.).

Veera
quelle

Antworten:

102

Schauen Sie sich diese Seite aus der Play-Dokumentation an. Es sagt:

Abgesehen von der h2-In-Memory-Datenbank, die hauptsächlich im Entwicklungsmodus nützlich ist, bietet Play 2.0 keine Datenbanktreiber. Für die Bereitstellung in der Produktion müssen Sie daher Ihren Datenbanktreiber als Anwendungsabhängigkeit hinzufügen.

Wenn Sie beispielsweise MySQL5 verwenden, müssen Sie eine Abhängigkeit für den Connector hinzufügen:

val appDependencies = Seq(
    // Add your project dependencies here,
    ...
    "mysql" % "mysql-connector-java" % "5.1.18"
    ...
)

SBT lädt den Treiber für Sie herunter. Lesen Sie auch den Abschnitt zum Verwalten von Abhängigkeiten .

Um eine Verbindung zu MySQL herzustellen, müssen Sie außerdem einige Einstellungen ändern in application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"
Carsten
quelle
Vielen Dank. Welche Konfigurationsänderungen sollte ich dann in der Datei application.conf vornehmen? (db.default.driver, db.default.url usw.)
Veera
@ Carsten, URL ohne Anführungszeichen zu geben wird scheitern
biesior
3
spielen Sie hier Framework 2.1.1. Nach dem Aktualisieren der Datei build.sbt sollten Sie den Befehl 'update' im Wiedergabeterminal
eingeben
9
Heutzutage sollte es in die build.sbt auf der Stammebene des Projekts eingefügt werden, z. B.: LibraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", Cache)
Adrian Scott
Wenn Sie es zum Laufen bringen, sollten Sie auch den Thread-Pool-Abschnitt der Dokumente lesen und Ihre Konfiguration entsprechend aktualisieren, da jdbc eine blockierende API ist. playframework.com/documentation/2.2.x/ThreadPools
johanandren
94

Wie Carsten schrieb, kann es aus der Dokumentation abgerufen werden, aber hier ist eine Zusammenfassung:

Stellen Sie sicher, dass Sie die Abhängigkeit in konfiguriert haben /project/Build.scala

val appDependencies = Seq(
    // Add your project dependencies here,
    "mysql" % "mysql-connector-java" % "5.1.18"
)

Fügen Sie eine richtige Konfiguration der Datenbank hinzu (ersetzen Sie die Standard-H2-Konfiguration) in /conf/application.conf :

(Codierung nicht von URL entfernen):

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/your_db_name?characterEncoding=UTF-8"
db.default.user=your_login
db.default.password=your_pass

Suchen Sie in derselben Datei und stellen Sie sicher, dass diese Zeile NICHT kommentiert ist:

ebean.default="models.*"

Das ist alles, starten Sie Ihre App neu (oder führen Sie sie im Entwicklungsmodus aus), dann wird eine DDL erstellt und Sie werden aufgefordert, sie anzuwenden.

biesior
quelle
Können Sie bitte auch die Dokumentation hier aktualisieren ? Github.com/playframework/playframework/blob/2.2.x/documentation/…, damit jeder davon profitieren kann? Vielen Dank!
Lavixu
Sie sollten auch sicherstellen, dass MySQL nicht nur auf Socket-Verbindungen (Mac / Linux) beschränkt ist und localhostmöglicherweise durch diese ersetzt werden muss 127.0.0.1. In specifict Bedingungen, mit MariaDB (ein Oracle-freien Fall Ersatz für MySQL) von MacPorts musste ich kommentieren Sie überspringen-Vernetzung in my.cnfund die IP - Adresse verwenden , anstatt localhostzu haben erfolgreich Connect zu spielen.
Seron
Warum haben Sie jdbc am Anfang der Datenbank-URL hinzugefügt?
BenMorganIO
@ BenMorganIO weil wir JDBC-Treiber verwenden müssen, eine solche Syntax, nichts weiter
biesior
Ich bin verwirrt. Was ist der Zweck von "jdbc: mysql:" in der URL? Ist "jdbc: mysql" der Name der Datenbank?
Michael Lafayette
10

Ich verwende Play 2.2.0 und musste nur die folgende Zeile zu build.sbt im Stammordner des Projekts hinzufügen.

  "mysql" % "mysql-connector-java" % "5.1.27"

Und play lädt automatisch den Treiber herunter. Es scheint, dass Build.scala dafür nicht mehr benötigt wird. Änderungen an application.conf sollten angewendet werden, wie die oben genannten Kommentatoren erwähnt haben.

jrook
quelle
Das hat mich nur gerettet. Verwenden Sie Play 2.10.3 und dies war der richtige Weg, dies zu tun.
Jack Slingerland
3
Danke dir!!! Für Leute, die detaillierte Anweisungen wie mich benötigen, gehen Sie im Grunde zu build.sbt und fügen Sie diese Zeile zulibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam
1
Vergessen Sie für Leute wie mich nicht, den ./activator anzuhalten und dann erneut auszuführen :)
Damir Olejar
8

Die meisten Methoden für den Zugriff auf eine MySQL-Datenbank, auf die ich gestoßen bin, erklären nicht, wie eine Verbindung hergestellt und Daten aus dem Modell abgerufen werden. In meiner Anwendung verwende ich sowohl mongoDB als auch eine externe MySQL-Datenbank. Also hier ist, wie ich (die MySQL-Seite) Dinge gemacht habe:

  1. Fügen Sie für Play 2.3.3 in der Datei build.sbt die mysql-spezifische Zeile in die libraryDependencies ein:

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
  2. Fügen Sie in der Datei /conf/application.conf Folgendes hinzu:

    db.myotherdb.driver = com.mysql.jdbc.Driver
    db.myotherdb.url = "jdbc:mysql://xxx.xxx.xxx.xxx/NameOfOtherDB?characterEncoding=UTF-8"
    db.myotherdb.user = MyOtherDbUSername
    db.myotherdb.password = MyOtherDbPass

    Sie können "myotherdb" durch "default" ersetzen, falls Sie die Standarddatenbank oder einen anderen Namen verwenden möchten, den Sie verwenden möchten. Ersetzen Sie "xxx.xxx.xxx.xxx" durch die IP-Adresse des Servers, auf dem sich Ihre Datenbank befindet (bei einer externen Datenbank), oder durch localhost (oder 127.0.0.1) für die lokale Datenbank. Ersetzen Sie "NameOfOtherDB" durch den Namen der Datenbank, die Sie verwenden möchten, "MyOtherDbUSername" durch Ihren Datenbankbenutzernamen und "MyOtherDbPass" durch Ihr Datenbankkennwort.

  3. Fügen Sie in Ihrem Modell (/app/models/MyModel.scala) Folgendes hinzu:

    val connection = DB.getConnection("myotherdb")
  4. Erstellen Sie die Anweisung, die Abfrage und führen Sie sie aus:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
  5. Anschließend können Sie mit den abgerufenen Daten fortfahren. Beispielsweise:

    while (resultset.next()) {
        resultset.getString("columnName")
    }

    Dabei ist "columnName" der Name der DB-Tabellenspalte / des DB-Tabellens, die Sie abrufen möchten.

Zu guter Letzt möchte ich darauf hinweisen, dass Sie die Verbindung möglicherweise schließen möchten, indem Sie close () aufrufen.

consuela
quelle
1
Ihr Beispiel ist sehr nützlich. Wie würde es für Play Java aussehen?
Lomse
6

Ich blieb bei meiner MySQL-Konfiguration hängen, bis ich diese fand.

Die wichtigsten Dinge aus @biesior Antwort:

  • Fügen Sie MySQL Connector / J in die Projektabhängigkeit ein (die sich darin befindet /project/Build.scala ).
  • Führen Sie nach dem Hinzufügen der Abhängigkeit aus play dependencies nach dem die neu hinzugefügte Abhängigkeit vom MySQL-Connector / J aus
  • Standardmäßige ebean-Konfigurationszeile auskommentieren ebean.default="models.*"
  • Konfigurieren Sie die MySQL-Datenbank korrekt mit der richtigen Zeichencodierung db.default.driver=com.mysql.jdbc.Driver db.default.url="jdbc:mysql://www.sample.com:3306/test?characterEncoding=UTF-8" db.default.user=playuser db.default.pass=playuser

Es hat meinen Tag gerettet.

ck1910
quelle
4

Zum Spielen 2.3.1Befolgen Sie Schritte.

1) Fügen Sie MySQL Connector / J in die Projektabhängigkeit ein (die sich in /project/build.sbt befindet).

libraryDependencies ++= Seq( javaJdbc, javaEbean, "mysql" % "mysql-connector-java" % "5.1.29"

2) Standardmäßige ebean-Konfigurationszeile auskommentieren ebean.default = "models. *"

3) Konfigurieren Sie die MySQL-Datenbank korrekt mit der richtigen Zeichencodierung

db.default.driver=com.mysql.jdbc.Driver    //this is com. and not org.
db.default.url="jdbc:mysql://127.0.0.1/test?characterEncoding=UTF-8"
db.default.user=playuser
db.default.pass=playuser

4) Die meisten Imp. Führen Sie einen Befehl zum erneuten Laden in der Konsole aus.

Arbeiten
quelle
Das funktioniert alles perfekt für mich vor Ort. Wenn ich jedoch ein dist-Paket erstelle, lade das Paket auf einen Ubuntu-Server hoch und versuche, die Anwendung zu starten, die ich erhalte java.sql.SQLException: No suitable driver found for mysql://....
Nick
Versuchen Sie, Ihren MySQL-Treiber in den Klassenpfad zu setzen.
Arbeiten
Ich habe es zu libraryDependencies in meiner build.sbt hinzugefügt (wodurch es lokal funktioniert hat) und auf dem Server habe ich es mit sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput installiert export CLASSPATH=/usr/share/java/mysql-connector-java.jarund auch hinzugefügt /etc/environment(wie unter help.ubuntu.com/community/JDBCAndMySQL beschrieben ). Es funktioniert immer noch nicht.
Nick
4

Spielen Sie 2.4.3 & MYSQL 5.7.9

Ich konnte dies zum Laufen bringen, indem ich Informationen aus allen vorherigen Antworten zusammensetzte. Hier ist also eine andere, die hoffentlich aktueller oder nützlicher für diejenigen mit einer ähnlichen Umgebung ist.

Umgebungsdetails: ( das ist was ich benutze )

  • Play 2.4.3 Dies kommt mit Activator-1.3.7-Minimum
  • JDK8, Sie sollten dies bereits haben, da ich nicht denke, dass diese Version des Spiels mit JDK7 funktioniert
  • MYSQL 5.7.9

appication.conf

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost:3306/testSchema?characterEncoding=UTF-8"
db.default.user=yourDBUserName
db.default.password=yourDBUserPass

Hinweis:

  • testSchema in der URL ist Ihr Datenbankname. Wenn Sie eine MYSQL-Workbench verwenden , wird diese im Abschnitt SCHEMAS aufgeführt. Ich habe mein testSchema angerufen. Andere nennen es vielleicht so etwas wie "myDatabase"
  • Der Port sollte der MYSQL-Port sein. Nicht Ihr Anwendungsport. Ich habe 3306das Beispiel eingefügt, da dies normalerweise die Standardeinstellung für MYSQL ist.

build.sbt

Fügen Sie diese Zeile unten zu Ihrer build.sbt-Datei hinzu. Dies sollte nach der libraryDependencies ++= Seq()Erklärung erfolgen.

libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.36"

Schließlich

  • Führen Sie diesen Befehl von Ihrem Projektstamm aus -> activator reload
  • Starten Sie Ihre Anwendung neu
Kris Hollenbeck
quelle
1

Zum Spielen von Java-Projekten mit SBT

Ändern Sie die libraryDependency in "build.sbt" so.

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "mysql" % "mysql-connector-java" % "5.1.27"
)

Führen Sie Ihr Projekt mit "Activator Run" aus.

Bei der Wiedergabe wird der erforderliche JDBC-Anschluss heruntergefahren.

Anand Kumar
quelle
1

Ich hatte das gleiche Problem in der neuesten Version 2.4.x mit Activator 1.3.6.

Hier sind die Schritte. Ich habe die hier beschriebenen Schritte befolgt https://www.playframework.com/documentation/2.4.x/JavaDatabase

Hier ist mein application.conf

# MySQL DB Configuration
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://{hostname or ipaddres}/{db name}?characterEncoding=UTF-8"
db.default.username=username  // Note that user id deprecated, instead use username. Though that is not a major issue
db.default.password="password"

# JPA Configurations
jpa.default=defaultPersistenceUnit
PlayKeys.externalizeResources = false

# JavaEbean configuration
ebean.default = ["models.*"]

Hier ist build.sbt

libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  javaWs,
  javaJpa,
  evolutions,
  "mysql" % "mysql-connector-java" % "5.1.27"
)

plugins.sbt

// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.3")

// Web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")

// Play enhancer - this automatically generates getters/setters for public fields
// and rewrites accessors of these fields to use the getters/setters. Remove this
// plugin if you prefer not to have this feature, or disable on a per project
// basis using disablePlugins(PlayEnhancer) in your build.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")

// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using
// enablePlugins(SbtEbean). Note, uncommenting this line will automatically bring in
// Play enhancer, regardless of whether the line above is commented out or not.
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")

Hier ist der wichtige Schritt.

Gehen Sie nach der Konfiguration der obigen Schritte zur Befehlszeile, stoppen Sie Ihren Aktivator und führen Sie den Befehl aus activator run. In meiner Situation bekam ich immer wieder den Fehler unable to find mysql drivers. Nach dem Ausführen von würde der activator runAktivator tatsächlich die MySQL-Treiber herunterladen und die Abhängigkeiten auflösen. Das ist der wichtige Schritt, der mein Problem gelöst hat.

Manjunath Reddy
quelle
1

Fügen Sie für mich diese Arbeit diese folgende Zeile in Ihre Abhängigkeiten ein:

"mysql" % "mysql-connector-java" % "5.1.36"

Hier ist der Code:

import java.sql.Connection

val driver = "com.mysql.jdbc.Driver"
val url = "jdbc:mysql://localhost/world"
val username = "root"
val password = "root"
var connection: Connection = null

try {
    // make the connection
    Class.forName(driver)
    connection = DriverManager.getConnection(url, username, password)

    // create the statement, and run the select query
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery("SELECT id , name FROM bar")

    val sql: SqlQuery = SQL("select * from products order by name asc")

    while (resultSet.next()) {
        val id = resultSet.getString("id")
        val name = resultSet.getString("name")
        println(id, name)
    }
} catch {
case e: Exception => println("exception caught: " + e);
}
connection.close()
SwwapnilShirke
quelle