Langkah-langkah yang diperlukan untuk menggunakan database MySQL dengan Play framework 2.0

91

Saya baru mengenal framework Play. Saya mencoba mengonfigurasi database MySQL sebagai sumber data untuk digunakan dengan Play Ebeans.

Bisakah Anda menjelaskan langkah-langkah yang diperlukan untuk mengkonfigurasi MySQL dengan kerangka kerja Play 2.0 (seperti, mengunduh driver, menambahkan ketergantungan, dll).

Veera
sumber

Jawaban:

102

Lihat halaman ini dari dokumentasi Play. Ia mengatakan:

Selain untuk database dalam memori h2, sebagian besar berguna dalam mode pengembangan, Play 2.0 tidak menyediakan driver database apa pun. Akibatnya, untuk menerapkan dalam produksi, Anda harus menambahkan driver database Anda sebagai dependensi aplikasi.

Misalnya, jika Anda menggunakan MySQL5, Anda perlu menambahkan ketergantungan untuk konektor:

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

SBT akan mengunduh driver untuk Anda. Anda juga harus memeriksa bagian tentang mengelola dependensi .

Untuk terhubung ke MySQL, Anda juga perlu mengubah beberapa pengaturan di application.conf:

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://root:secret@localhost/myDatabase"
Carsten
sumber
Terima kasih. Setelah selesai, apa saja perubahan konfigurasi yang harus saya lakukan di file application.conf? (db.default.driver, db.default.url, dll)
Veera
@Carsten, memberikan url tanpa tanda kutip akan gagal
biesior
3
mainkan framework 2.1.1 di sini. setelah memperbarui build.sbt, Anda harus memberikan perintah 'update' di terminal bermain
Kinjal Dixit
9
Saat ini, ia harus ditambahkan ke build.sbt di tingkat root proyek, misalnya: libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott
Saat Anda membuatnya berfungsi, Anda juga harus membaca bagian kumpulan utas dari dokumen dan memperbarui konfigurasi Anda sebagaimana mestinya karena jdbc adalah API pemblokiran. playframework.com/documentation/2.2.x/ThreadPools
johanandren
94

Seperti yang ditulis Carsten, itu dapat diambil dari dokumentasi, namun berikut ringkasannya:

pastikan Anda memiliki dependensi yang dikonfigurasi di /project/Build.scala

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

Tambahkan konfigurasi DB yang tepat (ganti konfigurasi H2 default) di /conf/application.conf:

(jangan hapus encoding dari 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

di file yang sama temukan dan pastikan baris ini TIDAK diberi komentar:

ebean.default="models.*"

Itu saja, mulai ulang aplikasi Anda (atau jalankan dalam mode pengembang), lalu itu akan membuat DDL dan meminta Anda untuk menerapkannya.

biesior
sumber
Bisakah Anda memperbarui dokumentasi juga di sini github.com/playframework/playframework/blob/2.2.x/documentation/… sehingga semua orang bisa mendapatkan keuntungan? Terima kasih!
Lavixu
Hal lain yang perlu dipertimbangkan adalah memastikan bahwa MySQL tidak terbatas pada koneksi soket saja (Mac / Linux) dan yang localhostmungkin perlu diganti 127.0.0.1. Dalam hal specifict, menggunakan MariaDB (penurunan Oracle bebas di pengganti MySQL) dari MacPorts saya harus komentar keluar skip-networking di my.cnfdan menggunakan alamat IP bukan localhostuntuk memiliki Bermain berhasil connect.
seron
Mengapa Anda menambahkan jdbc ke awal url db?
BenMorganIO
@BenMorganIO karena kita perlu menggunakan driver JDBC, sintaks seperti itu, tidak lebih
biesior
Saya bingung. Apa tujuan dari "jdbc: mysql:" di URL? Apakah "jdbc: mysql" adalah nama database?
Michael Lafayette
10

Saya menggunakan play 2.2.0 dan saya hanya perlu menambahkan baris berikut ke build.sbt di folder root proyek.

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

Dan bermain secara otomatis mengunduh driver. Sepertinya Build.scala tidak diperlukan untuk ini lagi. Perubahan pada application.conf harus diterapkan seperti yang telah disebutkan oleh komentator di atas.

jrook
sumber
Ini baru saja menyelamatkan saya. Menggunakan Play 2.10.3 dan ini adalah cara yang benar untuk melakukannya.
Jack Slingerland
3
Terima kasih!!! Untuk orang yang membutuhkan instruksi rinci seperti saya, pada dasarnya Anda pergi ke build.sbt dan tambahkan baris itu kelibraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam
1
Untuk orang-orang seperti saya, jangan lupa untuk menghentikan ./activator, lalu jalankan lagi :)
Damir Olejar
8

Sebagian besar metode mengakses database mysql yang saya temui tidak menjelaskan cara membuat koneksi dan mengambil data dari dalam Model. Dalam aplikasi saya, saya menggunakan mongoDB dan database mysql eksternal. Jadi, inilah cara saya melakukan (sisi mysql) hal-hal:

  1. Untuk Play 2.3.3, di file build.sbt tambahkan baris spesifik mysql di libraryDependencies:

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
    
  2. Di file /conf/application.conf tambahkan ini:

    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
    

    Anda dapat mengganti "myotherdb" dengan "default" jika Anda ingin menggunakan database default atau dengan nama lain yang ingin Anda gunakan. Ganti "xxx.xxx.xxx.xxx" dengan alamat IP server tempat database Anda berada (dalam kasus database eksternal) atau localhost (atau 127.0.0.1) untuk database lokal. Ganti "NameOfOtherDB" dengan nama database yang ingin Anda gunakan, "MyOtherDbUSername" dengan nama pengguna database Anda dan "MyOtherDbPass" dengan kata sandi database Anda.

  3. Di dalam Model Anda (/app/models/MyModel.scala) tambahkan ini:

    val connection = DB.getConnection("myotherdb")
    
  4. Buat pernyataan, kueri dan jalankan:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
    
  5. Kemudian Anda dapat melanjutkan apa pun yang ingin Anda lakukan dengan data yang diambil. Sebagai contoh:

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

    Di mana "nama kolom" adalah nama kolom / bidang tabel DB yang ingin Anda ambil.

Last but not least, saya ingin mencatat bahwa Anda mungkin ingin menutup koneksi dengan memanggil close ()

consuela
sumber
1
Teladan Anda sangat berguna. Bagaimana tampilan Play Java?
lomse
6

Terjebak dengan konfigurasi MySQL saya sampai saya menemukan ini.

Hal terpenting yang diambil dari jawaban @biesior:

  • Tambahkan konektor MySQL / J di dependensi proyek (yang ada di dalam /project/Build.scala)
  • Setelah menambahkan dependensi, jalankan play dependenciesuntuk menyelesaikan konektor MySQL / dependensi J yang baru ditambahkan
  • Hapus komentar pada baris konfigurasi ebean default ebean.default="models.*"
  • Konfigurasikan database MySQL dengan benar dengan pengkodean karakter yang tepat 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

Ini menyelamatkan hari saya.

ck1910
sumber
4

Untuk bermain 2.3.1 , Ikuti langkah-langkah ini.

1) Tambahkan konektor MySQL / J di ketergantungan proyek (yang ada di dalam /project/build.sbt)

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

2) Hapus komentar baris konfigurasi ebean default ebean.default = "model. *"

3) Konfigurasi database MySQL dengan benar dengan pengkodean karakter yang tepat

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) Kebanyakan Imp. Jalankan perintah muat ulang di konsol.

kerja
sumber
Ini berfungsi dengan baik untuk saya secara lokal. Tetapi ketika saya membuat paket dist, unggah paket tersebut ke server Ubuntu dan coba mulai aplikasi yang saya dapatkan java.sql.SQLException: No suitable driver found for mysql://....
Nick
coba letakkan driver mysql Anda di classpath.
bekerja
Saya telah menambahkannya ke libraryDependencies di build.sbt saya (yang membuatnya bekerja secara lokal) dan di server saya menginstalnya dengan sudo apt-get install mysql-client; sudo apt-get install libmysql-javaput export CLASSPATH=/usr/share/java/mysql-connector-java.jardan juga menambahkannya ke /etc/environment(seperti yang dijelaskan di help.ubuntu.com/community/JDBCAndMySQL ). Itu masih tidak berhasil.
Nick
4

Mainkan 2.4.3 & MYSQL 5.7.9

Saya bisa mendapatkan ini bekerja dengan mengumpulkan potongan-potongan info dari semua jawaban sebelumnya. Jadi ini satu lagi, yang semoga lebih up-to-date atau berguna bagi mereka yang memiliki lingkungan serupa.

Detail Lingkungan: ( inilah yang saya gunakan )

  • Mainkan 2.4.3 ini dilengkapi dengan aktivator-1.3.7-minimal
  • JDK8, Anda seharusnya sudah memiliki ini karena menurut saya versi play ini tidak berfungsi dengan 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

catatan:

  • testSchema di URL adalah nama database Anda, jika Anda menggunakan sesuatu seperti MYSQL workbench, Anda akan melihat ini tercantum di bawah bagian SKEMA. Saya menelepon testSchema saya. Orang lain mungkin menyebutnya sesuatu seperti "myDatabase"
  • Porta tersebut haruslah port MYSQL. Bukan port aplikasi Anda. Saya memasukkan 3306contoh karena itu biasanya default untuk MYSQL.

build.sbt

Tambahkan baris di bawah ini ke file build.sbt Anda. Ini harus dilakukan setelah libraryDependencies ++= Seq()deklarasi.

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

Akhirnya

  • jalankan perintah ini dari root proyek Anda -> activator reload
  • restart aplikasi Anda
Kris Hollenbeck
sumber
1

Untuk memainkan proyek java Menggunakan SBT

Ubah libraryDependency menjadi llok seperti ini di "build.sbt"

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

Jalankan proyek Anda menggunakan "aktivator run"

Putar akan menurunkan konektor jdbc yang diperlukan.

Anand Kumar
sumber
1

Saya memiliki masalah yang sama dalam kerangka bermain 2.4.x terbaru dengan aktivator 1.3.6.

Berikut langkah-langkahnya. Saya mengikuti langkah-langkah yang dijelaskan di sini https://www.playframework.com/documentation/2.4.x/JavaDatabase

Ini milikku 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.*"]

Disini adalah 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")

Inilah langkah penting.

Setelah mengonfigurasi langkah-langkah di atas, buka baris perintah, hentikan aktivator Anda dan jalankan perintah activator run. Dalam situasi saya, saya terus mendapatkan kesalahan unable to find mysql drivers. Setelah menjalankan activator run, aktivator akan mengunduh driver MySQL dan menyelesaikan dependensi. Itu adalah langkah penting yang menyelesaikan masalah saya.

Manjunath Reddy
sumber
1

Bagi saya pekerjaan ini, tambahkan baris di bawah ini ke dalam dependensi Anda:

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

Ini kodenya:

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
sumber