播放框架 - 通过URL中的参数将数据保存到数据库

时间:2014-02-18 10:25:04

标签: mysql scala playframework-2.2

我是Play Framework和Scala语言的新手。我想只通过运行带有指定参数的URL将一些数据保存到数据库。 例如,我想运行url,如:

  

/ DeviceData DEVICE_ID = 1&安培; insertDate = 2013-01-01&安培; windDirection = 50&安培; DEVICE_ID = 1&安培; insertDate = 2013年1月2日和安培; windDirection = 5

然后在数据库中插入两个新记录(使用Device_ID,insertDate和windDirection)。 现在我正试图一次只保存一条记录(我不知道如何阅读元素列表并保存它们)但事件是它无法正常工作。没有错误,它只是没有插入。

DeviceData模型

    case class DeviceData(data_ID: Long, device_ID: Long, insertDate: String, windDirection: Double)

object DeviceData{
    var deviceDataList = new HashMap[Long, DeviceData]
    var data_ID = 0L

    def nextId(): Long = { data_ID += 1; data_ID}

    def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) :Unit = { 
        DB.withConnection { implicit connection =>
            SQL(
                """
                    INSERT INTO devicedata(device_ID, insertDate, windDirection) 
                    VALUES ({device_ID}, {insertDate}, {windDirection})
                """
            ).
            on("device_ID" -> device_ID, "insertDate" -> insertDate, "windDirection" -> windDirection).
            executeInsert()
        }
    }

    def list(): List[DeviceData] = { deviceDataList.values.toList }
}

DeviceDatas控制器

    object DeviceDatas extends Controller {

  val deviceDataForm = Form(
    tuple(
      "device_ID" -> of[Long],
      "insertDate" -> nonEmptyText,
      "windDirection" -> of[Double]
    )
  )

  def listDeviceData() = Action {
    Ok(views.html.deviceData(DeviceData.list(), deviceDataForm))
  }

    def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) = Action { implicit request =>
      deviceDataForm.bindFromRequest.fold(
        errors => BadRequest(views.html.deviceData(DeviceData.list(), errors)),
        { case (device_ID, insertDate, windDirection) => {
            DeviceData.createDeviceData(device_ID, insertDate, windDirection)
            Redirect(routes.DeviceDatas.listDeviceData)
          }
        }
     )
  }
}

deviceData.scala.html - 这很简单,只是为了检查是否有新的插入记录。

    @(deviceDatas: List[DeviceData], deviceDataForm: Form[(Long, String, Double)])

@import helper._

@main("DeviceDatas"){
    <h3>@deviceDatas.size DeviceData(s)</h3>
}

/ deviceDatas

的路由文件
 GET    /deviceDatas                controllers.DeviceDatas.listDeviceData
POST    /deviceDatas                controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)

你能帮我解决一下如何将数据插入数据库,以及是否有可能放入包含少量记录的元素列表。在Play Framework中将DateTime(yyyy-MM-dd hh:mm:ss)插入URL参数的最佳方法是什么?我被困住了,我不知道该怎么做。

已更新

感谢Zim-Zam O'Pootertoot的答案。不幸的是我需要使用参数,因为我通过路由器发送数据。但无论如何还要多谢你,因为我将来会使用json。 我决定不使用前面所说的参数列表,但是对于一个新记录我发送一个请求(例如:向数据库添加6条新记录,我需要在路由器上运行6次URL:

/DeviceData?device_ID=1&insertDate=2013-01-01&windDirection=50

我的问题通过将路径文件更改为:

来解决
GET     /deviceDatas                controllers.DeviceDatas.listDeviceData
GET     /deviceDatas                controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)

1 个答案:

答案 0 :(得分:0)

要传递多个记录的数据,并传入DateTime数据,请在请求的json正文中发送数据而不是url params

http://www.playframework.com/documentation/2.2.x/ScalaBodyParsers

http://www.playframework.com/documentation/2.2.x/ScalaJson

Action(parse.json) { implicit request => 
  (request.body \ "records") match {
    case arr: JsArray => arr.value.foreach(json => {
      val deviceId = (json \ "device_ID").as[Long]
      val date = (json \ "insertDate").as[String]
      val windDirection = (json \ "windDirection").as[Double]
      // insert data in database
    })
    case _ => throw new IllegalArgumentException("Invalid Json: records must be a JsArray")
}}

您的记录的json可能类似于

{"records" : [
  {"device_ID" : 123, "insertDate" : "2014-03-01 12:00:00", "windDirection" : 123.45},
  {"device_ID" : 456, "insertDate" : "2014-03-02 12:00:00", "windDirection" : 54.321}]}