【问题标题】:Steps needed to use MySQL database with Play framework 2.0在 Play framework 2.0 中使用 MySQL 数据库所需的步骤
【发布时间】:2012-04-04 07:56:20
【问题描述】:

我是 Play 框架的新手。我正在尝试将 MySQL 数据库配置为与 Play Ebeans 一起使用的数据源。

能否请您解释一下使用 Play 2.0 框架配置 MySQL 所需的步骤(例如,下载驱动程序、添加依赖项等)。

【问题讨论】:

    标签: java playframework playframework-2.0 ebean


    【解决方案1】:

    查看 Play 文档中的 this page。它说:

    除了 h2 内存数据库,主要用于开发模式,Play 2.0 不提供任何数据库驱动程序。因此,要在生产环境中部署,您必须将数据库驱动程序添加为应用程序依赖项。

    例如,如果使用MySQL5,则需要为连接器添加依赖:

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

    SBT 将为您下载驱动程序。您还应该查看section on managing dependencies。

    要连接 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 等)
    • @Carsten,给出不带引号的网址会失败
    • 在此处播放框架 2.1.1。更新 build.sbt 后,您应该在播放终端中输入命令 'update'
    • 现在应该将它添加到项目根级别的 build.sbt 中,例如: libraryDependencies ++= Seq( javaJdbc, javaEbean, "mysql" % "mysql-connector-java " % "5.1.28", 缓存)
    • 当你让它工作时,你还应该阅读文档的线程池部分并相应地更新你的配置,因为 jdbc 是一个阻塞 API。 playframework.com/documentation/2.2.x/ThreadPools
    【解决方案2】:

    正如 Carsten 所写,它可以从文档中获取,但这里有一个摘要:

    确保您已在 /project/Build.scala 中配置了依赖项

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

    在/conf/application.conf中添加适当的数据库配置(替换默认的H2配置):

    (不要从 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.*"
    

    就是这样,重启你的应用程序(或在开发模式下运行),然后它会创建一个 DDL 并要求你应用它。

    【讨论】:

    • 能否请您也在这里更新文档github.com/playframework/playframework/blob/2.2.x/documentation/… 以便每个人都能受益?谢谢!
    • 其他要考虑的事情是确保 MySQL 不限于仅套接字连接 (Mac/Linux) 并且 localhost 可能需要替换为 127.0.0.1。具体而言,使用 MacPorts 中的 MariaDB(替代 MySQL 的无 Oracle 下降)我必须在 my.cnf 中注释掉 skip-networking 并使用 IP 地址而不是 localhost 才能成功连接。
    • 为什么要在db url开头添加jdbc?
    • @BenMorganIO 因为我们需要使用JDBC驱动,这样的语法,仅此而已
    • 我很困惑。 URL中“jdbc:mysql:”的目的是什么? “jdbc:mysql”是数据库的名字吗?
    【解决方案3】:

    我正在使用 play 2.2.0,我只需将以下行添加到项目根文件夹中的 build.sbt 中。

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

    播放会自动下载驱动程序。似乎不再需要 Build.scala 了。如上述评论员所述,应应用对 application.conf 的更改。

    【讨论】:

    • 这只是救了我。使用 Play 2.10.3,这是正确的方法。
    • 谢谢!!!对于像我这样需要详细说明的人,你基本上去 build.sbt 并将该行添加到libraryDependencies ++= Seq(jdbc,anorm,cache,"mysql" % "mysql-connector-java" % "5.1.27")
    • 像我这样的人,别忘了停止./activator,然后再运行一次:)
    【解决方案4】:

    我遇到的大多数访问 mysql 数据库的方法都没有解释如何建立连接并从模型中检索数据。在我的应用程序中,我同时使用 mongoDB 和外部 mysql 数据库。所以这就是我做的事情(mysql方面):

    1. 对于 Play 2.3.3,在 build.sbt 文件中的 libraryDependencies 中添加 mysql 特定行:

      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”替换为“default”。将“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”是您要检索的数据库表列/字段的名称。

    最后但并非最不重要的一点是,我想指出您可能希望通过调用 close()

    来关闭连接

    【讨论】:

    • 您的示例非常有用。 Play Java 会是什么样子?
    【解决方案5】:

    在我找到这个之前一直坚持我的 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

    它拯救了我的一天。

    【讨论】:

      【解决方案6】:

      玩 2.4.3 和 MYSQL 5.7.9

      我能够通过将所有先前答案的信息拼凑在一起来完成这项工作。所以这里是另一个,希望对那些有类似环境的人来说是最新的或有用的。

      环境细节:(这是我正在使用的)

      • 玩 2.4.3 这个自带 activator-1.3.7-minimal
      • JDK8,你应该已经有了这个,因为我认为这个版本的 play 不适用于 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
      

      注意:

        URL 中的
      • testSchema 是您的数据库名称,如果您使用 MYSQL workbench 之类的名称,您将在 SCHEMAS 部分看到此名称。我打电话给我的 testSchema。其他人可能会称它为“myDatabase”之类的东西
      • 端口应该是 MYSQL 端口。不是您的应用程序端口。我将3306 放在示例中,因为这通常是 MYSQL 的默认设置。

      build.sbt

      将下面的这一行添加到您的 build.sbt 文件中。这应该在 libraryDependencies ++= Seq() 声明之后。

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

      终于

      • 从你的项目根目录运行这个命令 -> activator reload
      • 重新启动您的应用程序

      【讨论】:

        【解决方案7】:

        对于play 2.3.1,请按照以下步骤操作。

        1) 在项目的依赖项中添加 MySQL 连接器/J(在 /project/build.sbt 中)

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

        2) 取消注释默认 ebean 配置行 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) 最大展示次数。在控制台中运行 reload 命令。

        【讨论】:

        • 这对我来说在本地工作得很好。但是当我创建一个 dist 包时,将包上传到 Ubuntu 服务器并尝试启动我得到 java.sql.SQLException: No suitable driver found for mysql://... 的应用程序。
        • 尝试把你的mysql驱动放到classpath中。
        • 我已将它添加到我的 build.sbt 中的 libraryDependencies 中(使其在本地工作),并在服务器上我使用sudo apt-get install mysql-client; sudo apt-get install libmysql-java 安装了它,放入export CLASSPATH=/usr/share/java/mysql-connector-java.jar 并将其添加到@ 987654327@(如help.ubuntu.com/community/JDBCAndMySQL 所述)。还是不行。
        【解决方案8】:

        使用 SBT 玩 java 项目

        在“build.sbt”中将 libraryDependency 更改为 llok

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

        使用“activator run”运行您的项目

        Play 将关闭所需的 jdbc 连接器。

        【讨论】:

          【解决方案9】:

          我在最新的 play framework 2.4.x 和 activator 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 驱动程序并解决依赖关系。这是解决我的问题的重要一步。

          【讨论】:

            【解决方案10】:

            对我来说,这项工作,将下面这一行添加到您的依赖项中:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-11-05
              • 2012-12-12
              • 2013-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多