slick使用普通的sql操作数据

1.无论使用slick的"集合"来操作数据还是使用sql来操作数据,最终还是构建DBIOAction,让后交给DB处理,类是FP中monid的action

需要注意的是run

Run an Action asynchronously and return the result as a Future

sqlu,sql,tsql的字面意思来构建一个DBAction

sqlu是用于单行的DML操作,而非结果集的操作

例如

    sqlu"insert into suppliers values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199')"


sql是用于结果集的

sql"""select c.name, s.name
      from coffees c, suppliers s
      where c.price < $price and s.id = c.sup_id""".as[(String, String)]

tsql是对类型进行检查的

例如上面的sql是没有进行类型检测的,他通过as将结果转化成元组

(

as是一个带implicit参数的方法特别是你在将查询结果转化成自定的类型是需要

    implicit val getCoffeeResult = GetResult(r => Coffee(r.<<, r.<<, r.<<, r.<<, r.<<))
    val table = "coffees"
    val name  = "Colombian"

    val query2:DBIO[Seq[Coffee]] = sql"""SELECT * FROM #$table where name = $name""".as[Coffee]

)
一个完整的例子

object SlickTest2 extends App{

  val db = Database.forConfig("mysql")

  def createCoffees:DBIO[Int] = sqlu"""create table coffees(
    name varchar(20) not null,
    sup_id int not null,
    price double not null,
    sales int not null,
    total int not null,
    foreign key(sup_id) references suppliers(id))"""

  def createSuppliers:DBIO[Int] = sqlu"""create table suppliers(
    id int not null primary key,
    name varchar(20) not null,
    street varchar(30) not null,
    city varchar(30) not null,
    state varchar(80) not null,
    zip varchar(10) not null)"""
  def insert2(c:Coffee) : DBIO[Int] = sqlu""" insert into coffees values(${c.name},${c.sup_id},${c.price},${c.sales},${c.total})  """

  def insert1(s:Supplier) : DBIO[Int] = sqlu""" insert into suppliers values(${s.id},${s.name},${s.street},${s.city},${s.state},${s.zip})   """



  try{
    val tables:DBIO[Unit] = DBIO.seq(
       //createSuppliers,
       //createCoffees
    )
    /*val f1:Future[Unit] = db.run(tables)
    val f2 = f1.flatMap { _ =>

        val set1:Seq[DBIO[Int]] = Seq(
          Supplier(101, "Acme, Inc."     , "99 Market Street", "Groundsville", "CA", "95199"),
          Supplier( 49, "Superior Coffee", "1 Party Place"   , "Mendocino"   , "CA", "95460"),
          Supplier(150, "The High Ground", "100 Coffee Lane" , "Meadows"     , "CA", "93966")
        ).map(insert1)

        val set2:Seq[DBIO[Int]] = Seq(
          Coffee("Colombian",          101,  7.99, 0, 0),
          Coffee("French_Roast",       49,   8.99, 0, 0),
          Coffee("Espresso",           150,  9.99, 0, 0),
          Coffee("Colombian_Decaf",    101,  8.99, 0, 0),
          Coffee("French_Roast_Decaf", 49,   9.99, 0, 0)
        ).map(insert2)

        val f:Future[Seq[Int]] = db.run(DBIO.sequence(set2))

        f.map(println)
    }*/

    //val query1 = sql"""SELECT FROM C.NAME,S.NAME FROM COFFEES C,SUPPLIERS S WHERE C.PRICE < $PRICE AND S.ID = C.SUP_ID""".as[(String,String)]
    implicit val getSupplierResult = GetResult(r => Supplier(r.nextInt, r.nextString, r.nextString, r.nextString, r.nextString, r.nextString))
    implicit val getCoffeeResult = GetResult(r => Coffee(r.<<, r.<<, r.<<, r.<<, r.<<))
    val table = "coffees"
    val name  = "Colombian"

    val query2:DBIO[Seq[Coffee]] = sql"""SELECT * FROM #$table where name = $name""".as[Coffee]
    val resultQuery2:Future[Seq[Coffee]] = db.run(query2)

    resultQuery2 onComplete {
      case Success(data) => data.foreach(println)
      case Failure(msg)  => println(msg.toString)
    }

    //堵塞线程,避免数据库被关闭
    Await.result(resultQuery2,Duration.Inf)

  } finally db.close
}


 

 

 

 


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值