Passaggi necessari per utilizzare il database MySQL con il framework Play 2.0


91

Sono nuovo in Play framework. Sto cercando di configurare il database MySQL come un'origine dati da utilizzare con Play Ebeans.

Qualcuno potrebbe spiegare i passaggi necessari per configurare MySQL con il framework Play 2.0 (come scaricare i driver, aggiungere dipendenze, ecc.).

Risposte:


102

Guarda questa pagina dalla documentazione di Play. Dice:

A parte il database in memoria h2, utile soprattutto in modalità di sviluppo, Play 2.0 non fornisce alcun driver di database. Di conseguenza, per distribuire in produzione sarà necessario aggiungere il driver del database come dipendenza dell'applicazione.

Ad esempio, se utilizzi MySQL5, devi aggiungere una dipendenza per il connettore:

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

SBT scaricherà il driver per te. Dovresti anche controllare la sezione sulla gestione delle dipendenze .

Per connetterti a MySQL, dovrai anche modificare alcune impostazioni nel tuo application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"

Grazie. Una volta fatto, quali sarebbero le modifiche alla configurazione dovrei apportare nel file application.conf? (db.default.driver, db.default.url, ecc.)
Veera

@Carsten, dare l'URL senza virgolette fallirà
biesior

3
gioca framework 2.1.1 qui. dopo aver aggiornato il build.sbt, dovresti dare il comando 'update' nel terminale di gioco
Kinjal Dixit

9
Al giorno d'oggi, dovrebbe essere aggiunto a build.sbt a livello di root del progetto, ad esempio: libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott

Quando lo fai funzionare dovresti anche leggere la sezione del pool di thread dei documenti e aggiornare la tua configurazione di conseguenza poiché jdbc è un'API di blocco. playframework.com/documentation/2.2.x/ThreadPools
johanandren

94

Come ha scritto Carsten, può essere recuperato dalla documentazione, tuttavia ecco un riepilogo:

assicurati di avere la dipendenza configurata in /project/Build.scala

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

Aggiungi una configurazione corretta del DB (sostituisci la configurazione H2 predefinita) in /conf/application.conf:

(non rimuovere la codifica dall'URL):

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

nello stesso file trova e assicurati che questa riga NON sia commentata:

ebean.default="models.*"

Questo è tutto, riavvia la tua app (o esegui in modalità sviluppatore), quindi creerà un DDL e ti chiederà di applicarlo.


Puoi aggiornare anche la documentazione qui github.com/playframework/playframework/blob/2.2.x/documentation/… in modo che tutti possano trarne vantaggio? Grazie!
Lavixu

Altre cose da considerare è assicurarsi che MySQL non sia limitato alle connessioni solo socket (Mac / Linux) e che localhostpotrebbe essere necessario sostituirlo con 127.0.0.1. In termini specifici, utilizzando MariaDB (un drop senza Oracle in sostituzione di MySQL) da MacPorts ho dovuto commentare saltare il collegamento in retemy.cnf e utilizzare l'indirizzo IP invece di localhostavere Play connesso correttamente.
seron

Perché hai aggiunto jdbc all'inizio dell'URL del database?
BenMorganIO

@ BenMorganIO perché dobbiamo usare il driver JDBC, una sintassi del genere, niente di più
biesior

Non ho capito bene. Qual è lo scopo di "jdbc: mysql:" nell'URL? "Jdbc: mysql" è il nome del database?
Michael Lafayette

10

Sto usando play 2.2.0 e ho dovuto aggiungere la seguente riga a build.sbt nella cartella principale del progetto.

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

E il gioco scarica automaticamente il driver. Sembra che Build.scala non sia più necessario per questo. Le modifiche a application.conf dovrebbero essere applicate come menzionato dai commentatori sopra.


Questo mi ha appena salvato. Usando Play 2.10.3 e questo era il modo corretto per farlo.
Jack Slingerland

3
Grazie!!! Per le persone che hanno bisogno di istruzioni dettagliate come me, fondamentalmente vai su build.sbt e aggiungi quella riga alibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam,

1
Per le persone come me, non dimenticare di interrompere ./activator, quindi eseguirlo di nuovo :)
Damir Olejar

8

La maggior parte dei metodi di accesso a un database mysql che ho incontrato non spiega come stabilire una connessione e recuperare i dati dall'interno del modello. Nella mia applicazione, utilizzo sia mongoDB che un database mysql esterno. Quindi ecco come ho fatto (il lato mysql delle) cose:

  1. Per Play 2.3.3, nel file build.sbt aggiungi la riga specifica di mysql nella libraryDependencies:

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
  2. Nel file /conf/application.conf aggiungi questo:

    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

    Puoi sostituire "myotherdb" con "default" nel caso in cui desideri utilizzare il database predefinito o con qualsiasi altro nome che desideri utilizzare. Sostituisci "xxx.xxx.xxx.xxx" con l'indirizzo IP del server in cui si trova il tuo database (nel caso di un database esterno) o localhost (o 127.0.0.1) per il database locale. Sostituire "NameOfOtherDB" con il nome del database che si desidera utilizzare, "MyOtherDbUSername" con il nome utente del database e "MyOtherDbPass" con la password del database.

  3. All'interno del tuo modello (/app/models/MyModel.scala) aggiungi questo:

    val connection = DB.getConnection("myotherdb")
  4. Crea l'istruzione, la query ed eseguila:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
  5. Quindi puoi continuare con quello che vuoi fare con i dati recuperati. Per esempio:

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

    Dove "columnName" è il nome della colonna / campo della tabella DB che si desidera recuperare.

Ultimo ma non meno importante, vorrei sottolineare che potresti voler chiudere la connessione chiamando close ()


1
Il tuo esempio è molto utile. Come sarebbe per Play Java?
lomse

6

Sono rimasto bloccato con la mia configurazione MySQL fino a quando non l'ho trovato.

Cose più importanti prese dalla risposta di @biesior:

  • Aggiungi il connettore MySQL / J nella dipendenza del progetto (che si trova all'interno /project/Build.scala)
  • Dopo aver aggiunto la dipendenza, esegui play dependenciesper risolvere il connettore MySQL / dipendenza J appena aggiunto
  • Rimuovere il commento dalla riga di configurazione ebean predefinita ebean.default="models.*"
  • Configura correttamente il database MySQL con la corretta codifica dei caratteri 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

Mi ha salvato la giornata.


4

Per giocare 2.3.1 , segui questi passaggi.

1) Aggiungi il connettore MySQL / J nella dipendenza del progetto (che si trova all'interno di /project/build.sbt)

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

2) Rimuovere il commento dalla riga di configurazione ebean predefinita ebean.default = "models. *"

3) Configurare correttamente il database MySQL con la corretta codifica dei caratteri

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) La maggior parte degli imp. Esegui un comando di ricarica nella console.


Funziona tutto perfettamente bene per me localmente. Ma quando creo un pacchetto dist, carico il pacchetto su un server Ubuntu e provo ad avviare l'applicazione che ottengo java.sql.SQLException: No suitable driver found for mysql://....
Nick

prova a mettere il tuo driver mysql in classpath.
funzionante il

L'ho aggiunto a libraryDependencies nel mio build.sbt (che lo ha fatto funzionare localmente) e sul server l'ho installato con sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput export CLASSPATH=/usr/share/java/mysql-connector-java.jare l' ho anche aggiunto /etc/environment(come descritto su help.ubuntu.com/community/JDBCAndMySQL ). Ancora non funziona.
Nick

4

Riproduci 2.4.3 e MYSQL 5.7.9

Sono stato in grado di farlo funzionare mettendo insieme bit di informazioni da tutte le risposte precedenti. Quindi eccone un altro, che si spera sia più aggiornato o utile a chi ha un ambiente simile.

Dettagli sull'ambiente: ( questo è quello che sto usando )

  • Gioca 2.4.3 questo viene fornito con activator-1.3.7-minimal
  • JDK8, dovresti già averlo perché non penso che questa versione di gioco funzioni con JDK7
  • 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

Nota:

  • testSchema nell'URL è il nome del tuo database, se stai usando qualcosa come il workbench MYSQL , lo vedrai elencato nella sezione SCHEMAS. Ho chiamato il mio testSchema. Altri potrebbero chiamarlo qualcosa come "myDatabase"
  • La porta dovrebbe essere la porta MYSQL. Non la porta dell'applicazione. Ho inserito 3306l'esempio perché di solito è l'impostazione predefinita per MYSQL.

build.sbt

Aggiungi questa riga di seguito al tuo file build.sbt. Questo dovrebbe andare dopo la libraryDependencies ++= Seq()dichiarazione.

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

Finalmente

  • esegui questo comando dalla root del tuo progetto -> activator reload
  • riavvia la tua applicazione

1

Per il gioco java project utilizzando SBT

Cambia la libraryDependency in llok in questo modo in "build.sbt"

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

Esegui il tuo progetto utilizzando "activator run"

La riproduzione interromperà il connettore jdbc richiesto.


1

Ho avuto lo stesso problema nell'ultimo framework di gioco 2.4.x con l'attivatore 1.3.6.

Ecco i passaggi. Ho seguito i passaggi descritti qui https://www.playframework.com/documentation/2.4.x/JavaDatabase

Ecco il mio 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.*"]

Qui è 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")

Ecco il passaggio importante.

Dopo aver configurato i passaggi precedenti, vai alla riga di comando, arresta l'attivatore ed esegui il comando activator run. Nella mia situazione, continuavo a ricevere l'errore unable to find mysql drivers. Dopo aver eseguito activator run, l'attivatore scarica effettivamente i driver MySQL e risolve le dipendenze. Questo è il passaggio importante che ha risolto il mio problema.


1

Per me questo lavoro, aggiungi questo sotto la riga nelle tue dipendenze:

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

Ecco il codice:

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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.