Kroki potrzebne do korzystania z bazy danych MySQL z Play Framework 2.0

91

Jestem nowy w Play Framework. Próbuję skonfigurować bazę danych MySQL jako źródło danych do użycia z Play Ebeans.

Czy mógłby ktoś wyjaśnić kroki, które są potrzebne do skonfigurowania MySQL z frameworkiem Play 2.0 (np. Pobieranie sterowników, dodawanie zależności itp.).

Veera
źródło

Odpowiedzi:

102

Spójrz na tę stronę w dokumentacji Play. To mówi:

Poza bazą danych w pamięci h2, przydatną głównie w trybie programistycznym, Play 2.0 nie udostępnia żadnych sterowników do bazy danych. W związku z tym, aby wdrożyć w środowisku produkcyjnym, musisz dodać sterownik bazy danych jako zależność aplikacji.

Na przykład, jeśli używasz MySQL5, musisz dodać zależność dla łącznika:

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

SBT pobierze dla Ciebie sterownik. Powinieneś również zapoznać się z sekcją dotyczącą zarządzania zależnościami .

Aby połączyć się z MySQL, musisz również zmienić niektóre ustawienia w application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"
Carsten
źródło
dzięki. Gdy to zrobisz, jakie zmiany konfiguracyjne powinienem wprowadzić w pliku application.conf? (db.default.driver, db.default.url itp.)
Veera
@Carsten, podanie adresu URL bez cudzysłowu nie powiedzie się
biesior
3
Play Framework 2.1.1 tutaj. po zaktualizowaniu build.sbt należy wydać polecenie „update” w terminalu odtwarzania
Kinjal Dixit
9
Obecnie należy go dodać do pliku build.sbt na poziomie głównym projektu, np .: libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott,
Kiedy zaczniesz działać, powinieneś również przeczytać sekcję puli wątków w dokumentacji i odpowiednio zaktualizować konfigurację, ponieważ jdbc jest blokującym interfejsem API. playframework.com/documentation/2.2.x/ThreadPools
johanandren
94

Jak napisał Carsten, można to pobrać z dokumentacji, jednak oto podsumowanie:

upewnij się, że masz skonfigurowaną zależność w programie /project/Build.scala

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

Dodaj odpowiednią konfigurację DB (zastąp domyślną konfigurację H2) w /conf/application.conf:

(nie usuwaj kodowania z adresu 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

w tym samym pliku znajdź i upewnij się, że ta linia NIE jest komentowana:

ebean.default="models.*"

To wszystko, uruchom ponownie aplikację (lub uruchom w trybie deweloperskim), a następnie utworzy DDL i poprosi Cię o zastosowanie.

biesior
źródło
Czy możesz zaktualizować dokumentację również tutaj github.com/playframework/playframework/blob/2.2.x/documentation/ , aby każdy mógł skorzystać? Dzięki!
Lavixu
Inną kwestią do rozważenia jest upewnienie się, że MySQL nie ogranicza się do połączeń tylko przez gniazdo (Mac / Linux) i które localhostmogą wymagać zastąpienia 127.0.0.1. Pod względem specifict, stosując MariaDB (Oracle wolne spadek zamiennik dla MySQL) z DarwinPorts musiałem wypowiedzieć się skip-networking w my.cnfi użyć adresu IP zamiast localhostmieć Zagraj powodzeniem connect.
kazanie
Dlaczego dodano jdbc na początku adresu URL db?
BenMorganIO
@BenMorganIO bo potrzebujemy sterownika JDBC, taka składnia, nic więcej
biesior
Jestem zmieszany. Jaki jest cel wpisania „jdbc: mysql:” w adresie URL? Czy „jdbc: mysql” to nazwa bazy danych?
Michael Lafayette
10

Używam play 2.2.0 i po prostu musiałem dodać następujący wiersz do pliku build.sbt w folderze głównym projektu.

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

A gra automatycznie pobiera sterownik. Wygląda na to, że Build.scala nie jest już do tego potrzebna. Zmiany w pliku application.conf należy zastosować, tak jak wspomnieli powyżsi komentatorzy.

jrook
źródło
To mnie właśnie uratowało. Korzystanie z Play 2.10.3 i to był właściwy sposób.
Jack Slingerland
3
Dziękuję Ci!!! Dla ludzi, którzy potrzebują szczegółowych instrukcji, takich jak ja, po prostu idź do build.sbt i dodaj tę linię dolibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam,
1
Dla ludzi takich jak ja nie zapomnij zatrzymać ./activator, a potem uruchomić go ponownie :)
Damir Olejar
8

Większość metod dostępu do bazy danych mysql, z którymi się spotkałem, nie wyjaśnia, jak nawiązać połączenie i pobrać dane z modelu. W mojej aplikacji używam zarówno mongoDB, jak i zewnętrznej bazy danych mysql. Oto jak zrobiłem (strona mysql) rzeczy:

  1. W przypadku Play 2.3.3 w pliku build.sbt dodaj wiersz specyficzny dla mysql w bibliotece

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
    
  2. W pliku /conf/application.conf dodaj to:

    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
    

    Możesz zamienić „myotherdb” na „default” w przypadku, gdy chcesz użyć domyślnej bazy danych lub z jakąkolwiek inną nazwą, której chcesz użyć. Zastąp „xxx.xxx.xxx.xxx” adresem IP serwera, na którym znajduje się Twoja baza danych (w przypadku zewnętrznej bazy danych) lub localhost (lub 127.0.0.1) dla lokalnej bazy danych. Zastąp „NameOfOtherDB” nazwą bazy danych, której chcesz użyć, „MyOtherDbUSername” nazwą użytkownika bazy danych, a „MyOtherDbPass” hasłem bazy danych.

  3. Wewnątrz swojego modelu (/app/models/MyModel.scala) dodaj to:

    val connection = DB.getConnection("myotherdb")
    
  4. Utwórz instrukcję, zapytanie i wykonaj je:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
    
  5. Następnie możesz kontynuować wszystko, co chcesz zrobić z pobranymi danymi. Na przykład:

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

    Gdzie „nazwa_kolumny” to nazwa kolumny / pola tabeli bazy danych, które chcesz pobrać.

Na koniec chciałbym zauważyć, że możesz chcieć zamknąć połączenie, wywołując close ()

consuela
źródło
1
Twój przykład jest bardzo przydatny. Jak by to wyglądało w przypadku Play Java?
lomse
6

Utknąłem z moją konfiguracją MySQL, dopóki tego nie znalazłem.

Najważniejsze rzeczy zaczerpnięte z odpowiedzi @biesior:

  • Dodaj złącze MySQL / J w zależności projektu (która jest w środku /project/Build.scala)
  • Po dodaniu zależności uruchom, play dependenciesaby rozwiązać nowo dodaną zależność łącznika MySQL / J
  • Odkomentuj domyślną linię konfiguracji ebean ebean.default="models.*"
  • Skonfiguruj poprawnie bazę danych MySQL z odpowiednim kodowaniem znaków 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

To uratowało mi dzień.

ck1910
źródło
4

W przypadku gry 2.3.1 wykonaj następujące kroki.

1) Dodaj złącze MySQL / J w zależności projektu (która znajduje się w /project/build.sbt)

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

2) Usuń komentarz z domyślnej linii konfiguracyjnej ebean ebean.default = "models. *"

3) Skonfiguruj poprawnie bazę danych MySQL z odpowiednim kodowaniem znaków

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) Większość Imp. Uruchom polecenie przeładowania w konsoli.

pracujący
źródło
To wszystko działa idealnie dla mnie lokalnie. Ale kiedy tworzę pakiet dist, przesyłam go na serwer Ubuntu i próbuję uruchomić otrzymaną aplikację java.sql.SQLException: No suitable driver found for mysql://....
Nick
spróbuj umieścić sterownik mysql w ścieżce klas.
praca
Dodałem go do libraryDependencies w moim build.sbt (co sprawiło, że działało lokalnie) i na serwerze, na którym zainstalowałem go za pomocą sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput, export CLASSPATH=/usr/share/java/mysql-connector-java.jara także dodałem /etc/environment(jak opisano na help.ubuntu.com/community/JDBCAndMySQL ). Nadal nie działa.
Nick
4

Zagraj w 2.4.3 i MYSQL 5.7.9

Udało mi się to osiągnąć, łącząc razem fragmenty informacji ze wszystkich poprzednich odpowiedzi. Oto kolejny, miejmy nadzieję, bardziej aktualny lub przydatny dla osób w podobnym środowisku.

Szczegóły środowiska: ( właśnie tego używam )

  • Zagraj w 2.4.3 to pochodzi z aktywatorem-1.3.7-minimal
  • JDK8, powinieneś już to mieć, ponieważ nie sądzę, aby ta wersja gry działała z 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

Uwaga:

  • testSchema w adresie URL to nazwa twojej bazy danych, jeśli używasz czegoś takiego jak Środowisko pracy MYSQL , zobaczysz to na liście w sekcji SCHEMATY. Nazwałem mój testSchema. Inni mogą nazywać to czymś w rodzaju „moja baza danych”
  • Port powinien być portem MYSQL. Nie twój port aplikacji. Podałem 3306przykład, ponieważ jest to zwykle domyślne ustawienie dla MYSQL.

build.sbt

Dodaj tę linię poniżej do pliku build.sbt. Powinno to nastąpić po libraryDependencies ++= Seq()deklaracji.

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

Wreszcie

  • uruchom to polecenie z katalogu głównego projektu -> activator reload
  • uruchom ponownie aplikację
Kris Hollenbeck
źródło
1

Do odtwarzania projektu java przy użyciu SBT

Zmień LibraryDependency na llok, jak to w "build.sbt"

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

Uruchom swój projekt za pomocą „uruchomienia aktywatora”

Play spowoduje wyłączenie wymaganego złącza JDBC.

Anand Kumar
źródło
1

Miałem ten sam problem w najnowszym frameworku gry 2.4.x z aktywatorem 1.3.6.

Oto kroki. Wykonałem czynności opisane tutaj https://www.playframework.com/documentation/2.4.x/JavaDatabase

Tutaj jest mój 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.*"]

Tutaj jest 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")

Oto ważny krok.

Po skonfigurowaniu powyższych kroków przejdź do wiersza poleceń, zatrzymaj aktywator i uruchom polecenie activator run. W mojej sytuacji ciągle otrzymywałem błąd unable to find mysql drivers. Po uruchomieniu activator runaktywator faktycznie pobierałby sterowniki MySQL i rozwiązałby zależności. To ważny krok, który rozwiązał mój problem.

Manjunath Reddy
źródło
1

Dla mnie ta praca, dodaj poniższą linię do swoich zależności:

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

Oto kod:

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
źródło