Etapas necessárias para usar o banco de dados MySQL com Play framework 2.0

91

Sou novo no Play framework. Estou tentando configurar o banco de dados MySQL como uma fonte de dados a ser usada com Play Ebeans.

Alguém poderia explicar os passos necessários para configurar o MySQL com o framework Play 2.0 (como baixar drivers, adicionar dependência, etc.).

Veera
fonte

Respostas:

102

Veja esta página da documentação do Play. Diz:

Exceto para o banco de dados h2 in-memory, útil principalmente no modo de desenvolvimento, o Play 2.0 não fornece nenhum driver de banco de dados. Consequentemente, para implantar na produção, você terá que adicionar seu driver de banco de dados como uma dependência do aplicativo.

Por exemplo, se você usa MySQL5, precisa adicionar uma dependência para o conector:

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

O SBT fará o download do driver para você. Você também deve verificar a seção sobre gerenciamento de dependências .

Para se conectar ao MySQL, você também precisará alterar algumas configurações em application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"
Carsten
fonte
obrigado. Feito isso, quais seriam as alterações de configuração que devo fazer no arquivo application.conf? (db.default.driver, db.default.url, etc)
Veera
@Carsten, fornecer url sem aspas irá falhar
biesior
3
play framework 2.1.1 aqui. depois de atualizar o build.sbt, você deve dar o comando 'update' no terminal de jogo
Kinjal Dixit
9
Atualmente, deve ser adicionado ao build.sbt no nível raiz do projeto, por exemplo: libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott
Quando você começar a trabalhar, você também deve ler a seção de pool de threads dos documentos e atualizar sua configuração de acordo, pois jdbc é uma API de bloqueio. playframework.com/documentation/2.2.x/ThreadPools
johanandren
94

Como Carsten escreveu, ele pode ser obtido na documentação, mas aqui está um resumo:

certifique-se de ter a dependência configurada em /project/Build.scala

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

Adicione uma configuração adequada do banco de dados (substitua a configuração H2 padrão) em /conf/application.conf:

(não remova a codificação do 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

no mesmo arquivo, localize e certifique-se de que esta linha NÃO seja comentada:

ebean.default="models.*"

Isso é tudo, reinicie seu aplicativo (ou execute no modo dev), então ele criará um DDL e pedirá que você o aplique.

biesior
fonte
Você pode atualizar a documentação também aqui github.com/playframework/playframework/blob/2.2.x/documentation/… para que todos possam se beneficiar? Obrigado!
Lavixu
Outras coisas a considerar é ter certeza de que o MySQL não está limitado a conexões somente de soquete (Mac / Linux) e que localhostpodem precisar ser substituídas por 127.0.0.1. Em termos specifict, utilizando MariaDB (uma queda da Oracle-livre substituto para MySQL) de MacPorts Eu tinha que comentar skip-networking em my.cnfe usar o endereço IP em vez de localhostter Jogar com sucesso de conexão.
seron
Por que você adicionou jdbc ao início do url do db?
BenMorganIO
@BenMorganIO porque precisamos usar o driver JDBC, tal sintaxe, nada mais
biesior 01 de
Estou confuso. Qual é o propósito de "jdbc: mysql:" no URL? "Jdbc: mysql" é o nome do banco de dados?
Michael Lafayette de
10

Estou usando o play 2.2.0 e só tive que adicionar a seguinte linha a build.sbt na pasta raiz do projeto.

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

E o play baixa automaticamente o driver. Parece que Build.scala não é mais necessário para isso. Mudanças em application.conf devem ser aplicadas como os comentaristas acima mencionaram.

torcer
fonte
Isso só me salvou. Usando o Play 2.10.3 e esta era a maneira correta de fazer isso.
Jack Slingerland
3
Obrigado!!! Para pessoas que precisam de instruções detalhadas como eu, você basicamente acessa build.sbt e adiciona essa linha alibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam
1
Para pessoas como eu, não se esqueça de parar o ./activator e depois executá-lo novamente :)
Damir Olejar
8

A maioria dos métodos de acesso a um banco de dados mysql que encontrei não explica como estabelecer uma conexão e recuperar dados de dentro do modelo. Em meu aplicativo, estou usando o mongoDB e um banco de dados externo do mysql. Então, aqui está como eu fiz (o lado mysql de) coisas:

  1. Para Play 2.3.3, no arquivo build.sbt, adicione a linha específica do mysql em libraryDependencies:

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
  2. No arquivo /conf/application.conf, adicione isto:

    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

    Você pode substituir "myotherdb" por "default" no caso de desejar usar o banco de dados padrão ou com qualquer outro nome que você deseja usar. Substitua "xxx.xxx.xxx.xxx" pelo endereço IP do servidor onde seu banco de dados está localizado (no caso de um banco de dados externo) ou localhost (ou 127.0.0.1) para banco de dados local. Substitua "NameOfOtherDB" pelo nome do banco de dados que deseja usar, "MyOtherDbUSername" pelo nome de usuário do banco de dados e "MyOtherDbPass" pela senha do banco de dados.

  3. Dentro do seu modelo (/app/models/MyModel.scala), adicione isto:

    val connection = DB.getConnection("myotherdb")
  4. Crie a declaração, a consulta e execute-a:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
  5. Em seguida, você pode continuar com o que deseja fazer com os dados recuperados. Por exemplo:

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

    Onde "columnName" é o nome da coluna / campo da tabela do banco de dados que você deseja recuperar.

Por último, mas não menos importante, gostaria de observar que talvez você queira encerrar a conexão chamando close ()

Consuela
fonte
1
Seu exemplo é muito útil. Como seria o Play Java?
lomse
6

Fiquei preso na configuração do MySQL até que encontrei isso.

As coisas mais importantes tiradas da resposta de @biesior:

  • Adicione o conector MySQL / J na dependência do projeto (que está dentro /project/Build.scala)
  • Depois de adicionar dependência, execute play dependenciespara resolver o conector MySQL / dependência J recém-adicionado
  • Descomente a linha de configuração ebean padrão ebean.default="models.*"
  • Configure o banco de dados MySQL corretamente com a codificação de caracteres adequada 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

Isso salvou meu dia.

ck1910
fonte
4

Para jogar 2.3.1 , siga estas etapas.

1) Adicione o conector MySQL / J na dependência do projeto (que está dentro de /project/build.sbt)

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

2) Remova o comentário da linha de configuração ebean padrão ebean.default = "models. *"

3) Configure o banco de dados MySQL corretamente com a codificação de caracteres adequada

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) Mais Imp. Execute um comando reload no console.

trabalhando
fonte
Isso funciona perfeitamente bem para mim localmente. Mas quando eu crio um pacote dist, carrego o pacote para um servidor Ubuntu e tento iniciar o aplicativo que obtenho java.sql.SQLException: No suitable driver found for mysql://....
Nick
tente colocar seu driver mysql no classpath.
trabalhando em
Eu o adicionei a libraryDependencies em meu build.sbt (o que o fez funcionar localmente) e no servidor em que instalei com sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput export CLASSPATH=/usr/share/java/mysql-connector-java.jare também o adicionei /etc/environment(conforme descrito em help.ubuntu.com/community/JDBCAndMySQL ). Ainda não funciona.
Nick
4

Tocar 2.4.3 e MYSQL 5.7.9

Consegui fazer isso funcionar juntando pedaços de informações de todas as respostas anteriores. Portanto, aqui está outro, que é esperançosamente mais atualizado ou útil para aqueles com um ambiente semelhante.

Detalhes do ambiente: ( é isso que estou usando )

  • Jogue 2.4.3 que vem com ativador-1.3.7-mínimo
  • JDK8, você já deve ter isso, pois não acho que esta versão do jogo funcione com 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 na URL é o nome do seu banco de dados, se você estiver usando algo como o ambiente de trabalho MYSQL , verá isso listado na seção ESQUEMAS. Liguei para o meu testSchema. Outros podem chamá-lo de algo como "meu banco de dados"
  • A porta deve ser a porta MYSQL. Não é a porta do seu aplicativo. Coloquei 3306o exemplo porque geralmente é o padrão para MYSQL.

build.sbt

Adicione esta linha abaixo ao seu arquivo build.sbt. Isso deve ir após a libraryDependencies ++= Seq()declaração.

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

Finalmente

  • execute este comando a partir da raiz do seu projeto -> activator reload
  • reinicie seu aplicativo
Kris Hollenbeck
fonte
1

Para jogar projeto java usando SBT

Altere o libraryDependency para funcionar assim em "build.sbt"

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

Execute seu projeto usando "ativação do ativador"

A reprodução desligará o conector jdbc necessário.

Anand Kumar
fonte
1

Eu tive o mesmo problema na última plataforma de jogo 2.4.x com ativador 1.3.6.

Aqui estão as etapas. Eu segui as etapas descritas aqui https://www.playframework.com/documentation/2.4.x/JavaDatabase

Aqui está o meu 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.*"]

Aqui está 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")

Aqui está o passo importante.

Após configurar as etapas acima, vá para a linha de comando, pare o ativador e execute o comando activator run. Na minha situação, continuava recebendo o erro unable to find mysql drivers. Depois de executar o activator run, o ativador realmente baixaria os drivers do MySQL e resolveria as dependências. Essa é a etapa importante que resolveu meu problema.

Manjunath Reddy
fonte
1

Para mim, este trabalho, adicione esta linha abaixo em suas dependências:

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

Aqui está o código:

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
fonte