play-slick基础:CRUD操作

Play框架提供了对Slick的集成模块play-slick。本文将介绍从后台数据库到前台请求的的全过程。

一、数据库建模

case class User(name:String, password:String,id:Option[Long] = None)

object User {

  implicit val userWrites: Writes[User] =
    (
      (JsPath \ "name").write[String]
        and (JsPath \ "password").write[String]
        and (JsPath \ "id").writeNullable[Long]
      )(unlift(User.unapply))

  implicit val userReads: Reads[User] = (
    (JsPath \ "name").read[String]
      and (JsPath \ "password").read[String]
      and (JsPath \ "id").readNullable[Long]
    )(User.apply _)

}

注意:id是一个可选的属性,必须放在最后面,否则会导致play在Json转换的时候报错。

建表:mysql. 注意 ID要定义为自动增长的列。

CREATE TABLE USER
(
  ID INT NOT NULL AUTO_INCREMENT,
  NAME VARCHAR(40) NOT NULL,
  PASSWORD VARCHAR(40) NOT NULL,
  PRIMARY KEY(ID)
);

二、Slick schema

import model._
import slick.driver.JdbcProfile
trait UserSchema {
  protected val driver: JdbcProfile
  import driver.api._
  class UserTable(tag: Tag) extends Table[User](tag, "USER") {
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
    def name = column[String]("NAME")
    def password = column[String]("PASSWORD")
    def * = (name, password, id.?) <> (User.tupled, User.unapply _)
  }
}

三、Play Action定义

列出所有的用户

  def usersList = Action.async {
    implicit request => {
      dbConfig.db.run(Users.result).map(res =>
        Ok(Json.toJson(res.toList))
      )
    }
  }

创建一个用户

  def addUser = Action.async(BodyParsers.parse.json) {
    implicit request => {
      val user = request.body.validate[User].get
      val insertQuery = (
        Users returning Users.map(_.id)) += user
      dbConfig.db.run(insertQuery).map {
        result =>
          Ok(Json.toJson(user.copy(id = Some(result))))
      }
    }
  }

删除一个用户

     def deleteUser(id: Long) = Action {
    val query = Users.filter(_.id === id).delete
    dbConfig.db.run(query)
    Ok("ok")
  }

更新一个用户

def updateUser(id: Long) = Action.async(BodyParsers.parse.json) {
    implicit request => {
      val newUser = request.body.validate[User].get
      val query = Users.filter(_.id === newUser.id).update(newUser)
      dbConfig.db.run(query).map {
        result => Ok(Json.toJson(newUser.id))
      }
    }
  }

application.conf配置

slick.dbs.default.driver= "slick.driver.MySQLDriver$"
slick.dbs.default.db.driver="com.mysql.jdbc.Driver"
slick.dbs.default.db.properties.driver="com.mysql.jdbc.Driver"
slick.dbs.default.db.user="root"
slick.dbs.default.db.password="root"
slick.dbs.default.db.url="jdbc:mysql://localhost:3306/xyz?useUnicode=true&characterEncoding=UTF-8"

然后再定义Controller时,直接注入配置好得DB连接就可以了。

class UserApplication @Inject()(dbConfigProvider: DatabaseConfigProvider)
  extends Controller with UserSchema with HasDatabaseConfig[JdbcProfile] {
  val dbConfig = dbConfigProvider.get[JdbcProfile]
  import driver.api._
  val Users = TableQuery[UserTable]
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值