Étapes nécessaires pour utiliser la base de données MySQL avec Play Framework 2.0

91

Je suis nouveau dans le cadre de jeu. J'essaie de configurer la base de données MySQL en tant que source de données à utiliser avec Play Ebeans.

Pourriez-vous quelqu'un s'il vous plaît expliquer les étapes nécessaires pour configurer MySQL avec le framework Play 2.0 (comme le téléchargement de pilotes, l'ajout de dépendances, etc.).

Veera
la source

Réponses:

102

Regardez cette page de la documentation de Play. Ça dit:

Hormis la base de données en mémoire h2, utile principalement en mode développement, Play 2.0 ne fournit aucun pilote de base de données. Par conséquent, pour déployer en production, vous devrez ajouter votre pilote de base de données en tant que dépendance d'application.

Par exemple, si vous utilisez MySQL5, vous devez ajouter une dépendance pour le connecteur:

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

SBT téléchargera le pilote pour vous. Vous devriez également consulter la section sur la gestion des dépendances .

Pour vous connecter à MySQL, vous devrez également modifier certains paramètres dans votre application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"
Carsten
la source
Merci. Une fois que cela est fait, quelles seraient les modifications de configuration que je devrais apporter dans le fichier application.conf? (db.default.driver, db.default.url, etc)
Veera
@Carsten, donner une URL sans guillemets échouera
biesior
3
jouer au framework 2.1.1 ici. après la mise à jour du build.sbt, vous devriez donner la commande 'update' dans le terminal de jeu
Kinjal Dixit
9
De nos jours, il devrait être ajouté dans le build.sbt à la racine du projet, par exemple: libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott
Lorsque vous le faites fonctionner, vous devez également lire la section du pool de threads de la documentation et mettre à jour votre configuration en conséquence, car jdbc est une API de blocage. playframework.com/documentation/2.2.x/ThreadPools
johanandren
94

Comme l'a écrit Carsten, il peut être extrait de la documentation, mais voici un résumé:

assurez-vous que la dépendance est configurée dans /project/Build.scala

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

Ajoutez une configuration appropriée de la base de données (remplacez la configuration H2 par défaut) dans /conf/application.conf :

(ne supprimez pas l'encodage de l'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

dans le même fichier, recherchez et assurez-vous que cette ligne n'est PAS commentée:

ebean.default="models.*"

C'est tout, redémarrez votre application (ou exécutez en mode dev), puis elle créera un DDL et vous demandera de l'appliquer.

biesior
la source
Pouvez-vous également mettre à jour la documentation ici github.com/playframework/playframework/blob/2.2.x/documentation/… afin que tout le monde puisse en profiter? Merci!
Lavixu
Vous devez également vous assurer que MySQL n'est pas limité aux connexions socket uniquement (Mac / Linux) et qu'il localhostfaudra peut-être le remplacer par 127.0.0.1. En termes précis, en utilisant MariaDB (une goutte sans Oracle en remplacement de MySQL) de MacPorts, j'ai dû commenter la mise en réseaumy.cnf et utiliser l'adresse IP au lieu de localhostconnecter Play avec succès.
seron
Pourquoi avez-vous ajouté jdbc au début de l'url de la base de données?
BenMorganIO
@BenMorganIO car nous devons utiliser le pilote JDBC, une telle syntaxe, rien de plus
biesior
Je suis confus. Quel est le but de "jdbc: mysql:" dans l'URL? "Jdbc: mysql" est-il le nom de la base de données?
Michael Lafayette
10

J'utilise play 2.2.0 et je devais juste ajouter la ligne suivante à build.sbt dans le dossier racine du projet.

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

Et jouer télécharge automatiquement le pilote. Il semble que Build.scala ne soit plus nécessaire pour cela. Les modifications apportées à application.conf doivent être appliquées comme les commentateurs ci-dessus l'ont mentionné.

jrook
la source
Cela m'a juste sauvé. Utiliser Play 2.10.3 et c'était la bonne façon de le faire.
Jack Slingerland
3
Je vous remercie!!! Pour les personnes qui ont besoin d'instructions détaillées comme moi, vous allez essentiellement sur build.sbt et ajoutez cette ligne àlibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam
1
Pour les gens comme moi, n'oubliez pas d'arrêter le ./activator, puis de le relancer :)
Damir Olejar
8

La plupart des méthodes d'accès à une base de données mysql que j'ai rencontrées n'expliquent pas comment établir une connexion et récupérer des données à partir du modèle. Dans mon application, j'utilise à la fois mongoDB et une base de données externe mysql. Alors, voici comment j'ai fait les choses (du côté mysql):

  1. Pour Play 2.3.3, dans le fichier build.sbt, ajoutez la ligne spécifique à mysql dans la bibliothèque.

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
  2. Dans le fichier /conf/application.conf, ajoutez ceci:

    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

    Vous pouvez remplacer "myotherdb" par "default" au cas où vous souhaiteriez utiliser la base de données par défaut ou par tout autre nom que vous souhaitez utiliser. Remplacez "xxx.xxx.xxx.xxx" par l'adresse IP du serveur sur lequel se trouve votre base de données (dans le cas d'une base de données externe) ou localhost (ou 127.0.0.1) pour la base de données locale. Remplacez «NameOfOtherDB» par le nom de la base de données que vous souhaitez utiliser, «MyOtherDbUSername» par votre nom d'utilisateur de base de données et «MyOtherDbPass» par votre mot de passe de base de données.

  3. À l'intérieur de votre modèle (/app/models/MyModel.scala), ajoutez ceci:

    val connection = DB.getConnection("myotherdb")
  4. Créez l'instruction, la requête et exécutez-la:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
  5. Ensuite, vous pouvez continuer avec tout ce que vous voulez faire avec les données récupérées. Par exemple:

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

    Où "columnName" est le nom de la colonne / du champ de la table de base de données que vous souhaitez récupérer.

Dernier point mais non le moindre, je voudrais noter que vous voudrez peut-être fermer la connexion en appelant close ()

Consuela
la source
1
Votre exemple est très utile. À quoi cela ressemblerait-il pour Play Java?
lomse
6

Je suis resté coincé avec ma configuration MySQL jusqu'à ce que je trouve cela.

Les éléments les plus importants tirés de la réponse @biesior:

  • Ajoutez le connecteur MySQL / J dans la dépendance du projet (qui est à l'intérieur /project/Build.scala )
  • Après avoir ajouté une dépendance, exécutez play dependencies pour résoudre la dépendance du connecteur MySQL / J nouvellement ajoutée
  • Annuler la mise en commentaire de la ligne de configuration ebean par défaut ebean.default="models.*"
  • Configurez correctement la base de données MySQL avec un encodage de caractères approprié 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

Cela m'a sauvé la journée.

ck1910
la source
4

Pour jouer 2.3.1 , suivez ces étapes.

1) Ajouter le connecteur MySQL / J dans la dépendance du projet (qui se trouve dans /project/build.sbt)

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

2) Décommentez la ligne de configuration ebean par défaut ebean.default = "models. *"

3) Configurez correctement la base de données MySQL avec un encodage de caractères approprié

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 plupart des Imp. Exécutez une commande de rechargement dans la console.

travail
la source
Cela fonctionne parfaitement bien pour moi localement. Mais lorsque je crée un package dist, téléchargez le package sur un serveur Ubuntu et essayez de démarrer l'application que j'obtiens java.sql.SQLException: No suitable driver found for mysql://....
Nick
essayez de mettre votre pilote mysql dans classpath.
travail
Je l'ai ajouté à libraryDependencies dans mon build.sbt (qui l'a fait fonctionner localement) et sur le serveur où je l'ai installé avec sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput export CLASSPATH=/usr/share/java/mysql-connector-java.jaret je l'ai également ajouté /etc/environment(comme décrit sur help.ubuntu.com/community/JDBCAndMySQL ). Ça ne marche toujours pas.
Nick
4

Jouer 2.4.3 et MYSQL 5.7.9

J'ai pu faire fonctionner cela en rassemblant des informations de toutes les réponses précédentes. En voici donc un autre, qui, espérons-le, est plus à jour ou utile à ceux qui ont un environnement similaire.

Détails de l'environnement: ( c'est ce que j'utilise )

  • Jouez à 2.4.3 avec activator-1.3.7-minimal
  • JDK8, vous devriez déjà l'avoir car je ne pense pas que cette version de jeu fonctionne avec 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

Remarque:

  • testSchema dans l'URL est le nom de votre base de données, si vous utilisez quelque chose comme MYSQL workbench, vous le verrez dans la section SCHEMAS. J'ai appelé le mien testSchema. D'autres peuvent l'appeler quelque chose comme "myDatabase"
  • Le port doit être le port MYSQL. Pas votre port d'application. J'ai mis 3306l'exemple car c'est généralement la valeur par défaut pour MYSQL.

build.sbt

Ajoutez cette ligne ci-dessous à votre fichier build.sbt. Cela devrait aller après la libraryDependencies ++= Seq()déclaration.

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

finalement

  • exécutez cette commande depuis la racine de votre projet -> activator reload
  • redémarrez votre application
Kris Hollenbeck
la source
1

Pour jouer au projet Java en utilisant SBT

Changez le libraryDependency en llok comme ceci dans "build.sbt"

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

Exécutez votre projet en utilisant "Activator Run"

La lecture désactivera le connecteur jdbc requis.

Anand Kumar
la source
1

J'ai eu le même problème dans le dernier framework de jeu 2.4.x avec l'activateur 1.3.6.

Voici les étapes. J'ai suivi les étapes décrites ici https://www.playframework.com/documentation/2.4.x/JavaDatabase

Voici mon 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.*"]

Voici 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")

Voici l'étape importante.

Après avoir configuré les étapes ci-dessus, accédez à la ligne de commande, arrêtez votre activateur et exécutez la commande activator run. Dans ma situation, j'obtenais toujours l'erreur unable to find mysql drivers. Après avoir exécuté le activator run, l'activateur téléchargerait les pilotes MySQL et résoudrait les dépendances. C'est l'étape importante qui a résolu mon problème.

Manjunath Reddy
la source
1

Pour moi ce travail, ajoutez cette ligne ci-dessous dans vos dépendances:

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

Voici le 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
la source