ขั้นตอนที่จำเป็นในการใช้ฐานข้อมูล MySQL กับ Play framework 2.0


91

ฉันยังใหม่กับ Play framework ฉันพยายามกำหนดค่าฐานข้อมูล MySQL เป็นแหล่งข้อมูลที่จะใช้กับ Play Ebeans

คุณช่วยอธิบายขั้นตอนที่จำเป็นในการกำหนดค่า MySQL ด้วยกรอบงาน Play 2.0 (เช่นการดาวน์โหลดไดรเวอร์การเพิ่มการอ้างอิง ฯลฯ )

คำตอบ:


102

ดูหน้านี้จากเอกสารของ Play มันบอกว่า:

นอกเหนือจากฐานข้อมูลในหน่วยความจำ h2 ส่วนใหญ่มีประโยชน์ในโหมดการพัฒนา Play 2.0 ไม่มีไดรเวอร์ฐานข้อมูลใด ๆ ดังนั้นในการปรับใช้ในการผลิตคุณจะต้องเพิ่มไดรเวอร์ฐานข้อมูลของคุณเป็นการพึ่งพาแอปพลิเคชัน

ตัวอย่างเช่นหากคุณใช้ MySQL5 คุณต้องเพิ่มการอ้างอิงสำหรับตัวเชื่อมต่อ:

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

SBT จะดาวน์โหลดไดรเวอร์ให้คุณ นอกจากนี้คุณยังควรตรวจสอบส่วนที่เกี่ยวกับการจัดการการอ้างอิง

ในการเชื่อมต่อกับ MySQL คุณจะต้องเปลี่ยนการตั้งค่าบางอย่างในapplication.conf:

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

ขอบคุณ. เมื่อเสร็จแล้วฉันควรทำการเปลี่ยนแปลงการกำหนดค่าอะไรในไฟล์ application.conf (db.default.driver, db.default.url ฯลฯ )
Veera

@Carsten ให้ url โดยไม่มีเครื่องหมายคำพูดจะล้มเหลว
biesior

3
เล่นกรอบ 2.1.1 ที่นี่ หลังจากอัปเดต build.sbt คุณควรให้คำสั่ง 'update' ใน play terminal
Kinjal Dixit

9
ปัจจุบันควรเพิ่มลงใน build.sbt ที่ระดับรูทของโปรเจ็กต์เช่น libraryDependencies ++ = Seq (javaJdbc, javaEbean, "mysql"% "mysql-connector-java"% "5.1.28", cache)
Adrian Scott

เมื่อคุณใช้งานได้คุณควรอ่านส่วนเธรดพูลของเอกสารและอัปเดตการกำหนดค่าของคุณตามนั้นเนื่องจาก jdbc เป็น API การบล็อก playframework.com/documentation/2.2.x/ThreadPools
johanandren

94

ดังที่ Carsten เขียนไว้สามารถดึงข้อมูลได้จากเอกสารอย่างไรก็ตามนี่คือบทสรุป:

ตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่าการอ้างอิงใน /project/Build.scala

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

เพิ่มการกำหนดค่าที่เหมาะสมของ DB (แทนที่ค่าเริ่มต้น H2 config) ใน/conf/application.conf:

(อย่าลบการเข้ารหัสออกจาก 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

ในไฟล์เดียวกันให้ค้นหาและตรวจสอบว่าไม่มีความคิดเห็นในบรรทัดนี้:

ebean.default="models.*"

เพียงเท่านี้ให้รีสตาร์ทแอปของคุณ (หรือเรียกใช้ในโหมด dev) จากนั้นจะสร้าง DDL และขอให้คุณใช้งาน


โปรดปรับปรุงเอกสารด้วยที่นี่github.com/playframework/playframework/blob/2.2.x/documentation/…เพื่อให้ทุกคนได้รับประโยชน์ ขอบคุณ!
Lavixu

สิ่งอื่น ๆ ที่จะต้องพิจารณาคือเพื่อให้แน่ใจว่า MySQL ไม่ จำกัด เฉพาะการเชื่อมต่อซ็อกเก็ตเท่านั้น (Mac / Linux) และอาจจะต้องถูกแทนที่ด้วยlocalhost 127.0.0.1ในแง่ specifict ใช้MariaDB (ลดลงของออราเคิลฟรีแทนสำหรับ MySQL) จาก MacPorts ผมต้องแสดงความคิดเห็นออกข้ามเครือข่ายในmy.cnfและใช้ที่อยู่ IP แทนการlocalhostที่จะมีการเล่นการเชื่อมต่อที่ประสบความสำเร็จ
seron

ทำไมคุณถึงเพิ่ม jdbc ที่จุดเริ่มต้นของ db url
BenMorganIO

@BenMorganIO ทำให้เราต้องใช้ไดรเวอร์ JDBC ไวยากรณ์เช่นนี้ไม่มีอะไรมาก
biesior

ฉันสับสน อะไรคือจุดประสงค์ของ "jdbc: mysql:" ใน URL "jdbc: mysql" เป็นชื่อของฐานข้อมูลหรือไม่
Michael Lafayette

10

ฉันใช้ play 2.2.0 และฉันต้องเพิ่มบรรทัดต่อไปนี้เพื่อ build.sbt ในโฟลเดอร์รูทของโปรเจ็กต์

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

และเล่นโดยอัตโนมัติดาวน์โหลดไดรเวอร์ ดูเหมือนว่า Build.scala ไม่จำเป็นสำหรับสิ่งนี้อีกต่อไป การเปลี่ยนแปลง application.conf ควรใช้ตามที่ผู้แสดงความคิดเห็นด้านบนได้กล่าวถึง


แค่นี้ก็ช่วยฉันแล้ว ใช้ Play 2.10.3 และนี่เป็นวิธีที่ถูกต้องในการทำ
Jack Slingerland

3
ขอบคุณ!!! สำหรับคนที่ต้องการคำแนะนำโดยละเอียดเช่นฉันโดยพื้นฐานแล้วคุณไปที่ build.sbt แล้วเพิ่มบรรทัดนั้นไปที่libraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
Dao Lam

1
สำหรับคนอย่างฉันอย่าลืมหยุด. /activator แล้วเรียกใช้อีกครั้ง :)
Damir Olejar

8

วิธีการเข้าถึงฐานข้อมูล mysql ส่วนใหญ่ที่ฉันพบไม่ได้อธิบายวิธีสร้างการเชื่อมต่อและดึงข้อมูลจากภายใน Model ในแอปพลิเคชันของฉันฉันใช้ทั้ง mongoDB และฐานข้อมูล mysql ภายนอก นี่คือวิธีที่ฉันทำ (ด้าน mysql):

  1. สำหรับ Play 2.3.3 ในไฟล์ build.sbt ให้เพิ่มบรรทัดเฉพาะ mysql ใน libraryDependencies:

    libraryDependencies ++= Seq(
        "mysql" % "mysql-connector-java" % "5.1.27"
    )
    
  2. ในไฟล์ /conf/application.conf ให้เพิ่มสิ่งนี้:

    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
    

    คุณสามารถแทนที่ "myotherdb" เป็น "ค่าเริ่มต้น" ในกรณีที่คุณต้องการใช้ฐานข้อมูลเริ่มต้นหรือด้วยชื่ออื่นที่คุณต้องการใช้ แทนที่ "xxx.xxx.xxx.xxx" ด้วยที่อยู่ IP ของเซิร์ฟเวอร์ที่ฐานข้อมูลของคุณตั้งอยู่ (ในกรณีของฐานข้อมูลภายนอก) หรือ localhost (หรือ 127.0.0.1) สำหรับฐานข้อมูลภายใน แทนที่ "NameOfOtherDB" ด้วยชื่อของฐานข้อมูลที่คุณต้องการใช้ "MyOtherDbUSername" ด้วยชื่อผู้ใช้ฐานข้อมูลของคุณและ "MyOtherDbPass" ด้วยรหัสผ่านฐานข้อมูลของคุณ

  3. ภายในโมเดลของคุณ (/app/models/MyModel.scala) ให้เพิ่มสิ่งนี้:

    val connection = DB.getConnection("myotherdb")
    
  4. สร้างคำสั่งแบบสอบถามและดำเนินการ:

    val statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
    val query = "SELECT * FROM myTableName"
    val resultset = statement.executeQuery(query)
    
  5. จากนั้นคุณสามารถดำเนินการต่อกับสิ่งที่คุณต้องการทำกับข้อมูลที่ดึงมา ตัวอย่างเช่น:

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

    โดยที่ "columnName" คือชื่อของคอลัมน์ / ฟิลด์ตาราง DB ที่คุณต้องการดึงข้อมูล

สุดท้าย แต่ไม่ท้ายสุดฉันต้องการทราบว่าคุณอาจต้องการปิดการเชื่อมต่อโดยการโทรปิด ()


1
ตัวอย่างของคุณมีประโยชน์มาก จะเป็นอย่างไรสำหรับ Play Java?
lomse

6

ติดอยู่กับการกำหนดค่า MySQL ของฉันจนกระทั่งฉันพบสิ่งนี้

สิ่งที่สำคัญที่สุดนำมาจากคำตอบของ @biesior:

  • เพิ่มตัวเชื่อมต่อ MySQL / J ในการอ้างอิงของโปรเจ็กต์ (ซึ่งอยู่ภายใน/project/Build.scala)
  • หลังจากเพิ่มการอ้างอิงแล้วให้รันplay dependenciesเพื่อแก้ไขตัวเชื่อมต่อ MySQL / การพึ่งพา J ที่เพิ่มใหม่
  • บรรทัดการกำหนดค่า ebean เริ่มต้นที่ไม่ใส่ข้อคิดเห็น ebean.default="models.*"
  • กำหนดค่าฐานข้อมูล MySQL อย่างถูกต้องด้วยการเข้ารหัสอักขระที่เหมาะสม 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

มันช่วยวันของฉัน


4

สำหรับการเล่น 2.3.1ให้ทำตามขั้นตอนต่อไปนี้

1) เพิ่มตัวเชื่อมต่อ MySQL / J ในการอ้างอิงของโปรเจ็กต์ (ซึ่งอยู่ภายใน /project/build.sbt)

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

2) Uncomment default ebean configuration line ebean.default = "models. *"

3) กำหนดค่าฐานข้อมูล MySQL อย่างถูกต้องด้วยการเข้ารหัสอักขระที่เหมาะสม

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) Imp ส่วนใหญ่ รันคำสั่งreloadในคอนโซล


ทั้งหมดนี้ใช้งานได้ดีสำหรับฉันในพื้นที่ แต่เมื่อผมสร้างแพคเกจอ, อัปโหลดแพคเกจไปยังเซิร์ฟเวอร์ Ubuntu java.sql.SQLException: No suitable driver found for mysql://...และพยายามที่จะเริ่มต้นโปรแกรมที่ฉันได้รับ
Nick

ลองใส่ไดรเวอร์ mysql ของคุณใน classpath
ทำงาน

ฉันได้เพิ่มลงใน libraryDependencies ใน build.sbt ของฉัน (ซึ่งทำให้มันใช้งานได้ในเครื่อง) และบนเซิร์ฟเวอร์ฉันได้ติดตั้งด้วยsudo apt-get install mysql-client; sudo apt-get install libmysql-javaput export CLASSPATH=/usr/share/java/mysql-connector-java.jarและเพิ่มเข้าไปใน/etc/environment(ตามที่อธิบายไว้ในhelp.ubuntu.com/community/JDBCAndMySQL ) มันยังใช้ไม่ได้
Nick

4

เล่น 2.4.3 และ MYSQL 5.7.9

ฉันสามารถทำงานนี้ได้โดยการรวบรวมข้อมูลจากคำตอบก่อนหน้าทั้งหมดเข้าด้วยกัน ดังนั้นนี่คืออีกสิ่งหนึ่งที่หวังว่าจะเป็นข้อมูลล่าสุดหรือเป็นประโยชน์กับผู้ที่มีสภาพแวดล้อมคล้ายกัน

รายละเอียดสภาพแวดล้อม: ( นี่คือสิ่งที่ฉันใช้ )

  • เล่น 2.4.3 นี้มาพร้อมกับตัวกระตุ้น -1.3.7 น้อยที่สุด
  • JDK8 คุณควรมีสิ่งนี้อยู่แล้วเพราะฉันไม่คิดว่าการเล่นเวอร์ชันนี้ใช้งานได้กับ 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

บันทึก:

  • testSchema ใน URL คือชื่อฐานข้อมูลของคุณหากคุณใช้บางอย่างเช่นMYSQL workbenchคุณจะเห็นสิ่งนี้แสดงอยู่ในส่วน SCHEMAS ฉันเรียกฉันว่า testSchema คนอื่นอาจเรียกมันว่า "myDatabase"
  • พอร์ตควรเป็นพอร์ต MYSQL ไม่ใช่พอร์ตแอปพลิเคชันของคุณ ฉันใส่3306ในตัวอย่างเพราะปกติแล้วจะเป็นค่าเริ่มต้นสำหรับ MYSQL

build.sbt

เพิ่มบรรทัดด้านล่างนี้ในไฟล์ build.sbt ของคุณ สิ่งนี้ควรดำเนินไปหลังจากการlibraryDependencies ++= Seq()ประกาศ

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

สุดท้าย

  • เรียกใช้คำสั่งนี้จากรูทโปรเจ็กต์ของคุณ -> activator reload
  • รีสตาร์ทแอปพลิเคชันของคุณ

1

สำหรับโปรเจ็กต์ play java โดยใช้ SBT

เปลี่ยน libraryDependency เป็น llok แบบนี้ใน "build.sbt"

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

ดำเนินโครงการของคุณโดยใช้ "activator run"

เล่นจะลงตัวเชื่อมต่อ jdbc ที่จำเป็น


1

ฉันมีปัญหาเดียวกันในกรอบการเล่นล่าสุด 2.4.x พร้อมตัวกระตุ้น 1.3.6

นี่คือขั้นตอน ฉันทำตามขั้นตอนที่อธิบายไว้ที่นี่https://www.playframework.com/documentation/2.4.x/JavaDatabase

นี่คือไฟล์ 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.*"]

ที่นี่คือ 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")

นี่คือขั้นตอนที่สำคัญ

activator runหลังจากตั้งค่าขั้นตอนข้างต้นไปที่บรรทัดคำสั่งหยุดการกระตุ้นของคุณและเรียกใช้คำสั่ง ในสถานการณ์ของฉันฉันได้รับข้อผิดพลาดunable to find mysql driversอยู่เรื่อย ๆ หลังจากเรียกใช้activator runตัวกระตุ้นจะดาวน์โหลดไดรเวอร์ MySQL และจะแก้ไขการอ้างอิง นั่นคือขั้นตอนสำคัญที่ช่วยแก้ไขปัญหาของฉัน


1

สำหรับฉันงานนี้เพิ่มบรรทัดด้านล่างนี้ในการอ้างอิงของคุณ:

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

นี่คือรหัส:

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.