slick Hello
2015-06-17 18:17
246 查看
slick的语法跟scalaQuery很相近,在学习Play时,有接触过ScalaQuery所以slick应该容易上手,这里记录自己从官方doc摘取的code加以少量整理
1.添加依赖
2.导入所需的api
Tag:
Slick’s API is fully asynchronous and runs database call in a separate thread pool. For running user code in composition
of DBIOAction and Future values,
we import the global ExecutionContext.
When using Slick as part of a larger application (e.g. with Play or Akka)
the framework may provide a better alternative to this default ExecutionContext.
3.数据库连接配置(resource/application.conf)
A Database object
usually manages a thread pool and a connection pool. You should always shut it down properly when it is no longer needed (unless the JVM process terminates anyway).
5.模型定义
The
output will be the same: For each row of the table, all columns get converted to strings and concatenated into one tab-separated string. The difference is that all of this now happens inside the database engine, and only the resulting concatenated string is
shipped to the client. Note that we avoid Scala’s + operator
(which is already heavily overloaded) in favor of ++ (commonly
used for sequence concatenation). Also, there is no automatic conversion of other argument types to strings. This has to be done explicitly with the type conversion method asColumnOf.
连接查询
1.添加依赖
libraryDependencies ++= List( "com.typesafe.slick" %% "slick" % "3.0.0", "org.slf4j" % "slf4j-nop" % "1.6.4", "com.h2database" % "h2" % "1.3.175", "org.scalatest" %% "scalatest" % "2.2.4" % "test" )
2.导入所需的api
import scala.concurrent.{Future, Await} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import slick.backend.DatabasePublisher import slick.driver.H2Driver.api._
Tag:
Slick’s API is fully asynchronous and runs database call in a separate thread pool. For running user code in composition
of DBIOAction and Future values,
we import the global ExecutionContext.
When using Slick as part of a larger application (e.g. with Play or Akka)
the framework may provide a better alternative to this default ExecutionContext.
3.数据库连接配置(resource/application.conf)
h2mem1 = { url = "jdbc:h2:mem:test1" driver = org.h2.Driver connectionPool = disabled keepAliveConnection = true }4.数据库操作
val db = Database.forConfig("h2mem1") try { // ... } finally db.closeTag:
A Database object
usually manages a thread pool and a connection pool. You should always shut it down properly when it is no longer needed (unless the JVM process terminates anyway).
5.模型定义
// Definition of the SUPPLIERS table class Suppliers(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "SUPPLIERS") { def id = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column def name = column[String]("SUP_NAME") def street = column[String]("STREET") def city = column[String]("CITY") def state = column[String]("STATE") def zip = column[String]("ZIP") // Every table needs a * projection with the same type as the table's type parameter def * = (id, name, street, city, state, zip) } val suppliers = TableQuery[Suppliers] // Definition of the COFFEES table class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") { def name = column[String]("COF_NAME", O.PrimaryKey) def supID = column[Int]("SUP_ID") def price = column[Double]("PRICE") def sales = column[Int]("SALES") def total = column[Int]("TOTAL") def * = (name, supID, price, sales, total) // A reified foreign key relation that can be navigated to create a join def supplier = foreignKey("SUP_FK", supID, suppliers)(_.id) } val coffees = TableQuery[Coffees]6.数据库的入口操作
val setup = DBIO.seq( // Create the tables, including primary and foreign keys (suppliers.schema ++ coffees.schema).create, // Insert some suppliers suppliers += (101, "Acme, Inc.", "99 Market Street", "Groundsville", "CA", "95199"), suppliers += ( 49, "Superior Coffee", "1 Party Place", "Mendocino", "CA", "95460"), suppliers += (150, "The High Ground", "100 Coffee Lane", "Meadows", "CA", "93966"), // Equivalent SQL code: // insert into SUPPLIERS(SUP_ID, SUP_NAME, STREET, CITY, STATE, ZIP) values (?,?,?,?,?,?) // Insert some coffees (using JDBC's batch insert feature, if supported by the DB) coffees ++= Seq( ("Colombian", 101, 7.99, 0, 0), ("French_Roast", 49, 8.99, 0, 0), ("Espresso", 150, 9.99, 0, 0), ("Colombian_Decaf", 101, 8.99, 0, 0), ("French_Roast_Decaf", 49, 9.99, 0, 0) ) // Equivalent SQL code: // insert into COFFEES(COF_NAME, SUP_ID, PRICE, SALES, TOTAL) values (?,?,?,?,?) ) val setupFuture = db.run(setup)7.简单的查询
// Read all coffees and print them to the console println("Coffees:") db.run(coffees.result).map(_.foreach { case (name, supID, price, sales, total) => println(" " + name + "\t" + supID + "\t" + price + "\t" + sales + "\t" + total) }) // Equivalent SQL code: // select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES
// Why not let the database do the string conversion and concatenation? val q1 = for(c <- coffees) yield LiteralColumn(" ") ++ c.name ++ "\t" ++ c.supID.asColumnOf[String] ++ "\t" ++ c.price.asColumnOf[String] ++ "\t" ++ c.sales.asColumnOf[String] ++ "\t" ++ c.total.asColumnOf[String] // The first string constant needs to be lifted manually to a LiteralColumn // so that the proper ++ operator is found // Equivalent SQL code: // select ' ' || COF_NAME || '\t' || SUP_ID || '\t' || PRICE || '\t' SALES || '\t' TOTAL from COFFEES db.stream(q1.result).foreach(println)Tag:
The
output will be the same: For each row of the table, all columns get converted to strings and concatenated into one tab-separated string. The difference is that all of this now happens inside the database engine, and only the resulting concatenated string is
shipped to the client. Note that we avoid Scala’s + operator
(which is already heavily overloaded) in favor of ++ (commonly
used for sequence concatenation). Also, there is no automatic conversion of other argument types to strings. This has to be done explicitly with the type conversion method asColumnOf.
连接查询
val q3 = for { c <- coffees if c.price < 9.0 s <- c.supplier } yield (c.name, s.name) // Equivalent SQL code: // select c.COF_NAME, s.SUP_NAME from COFFEES c, SUPPLIERS s where c.PRICE < 9.0 and s.SUP_ID = c.SUP_ID
相关文章推荐
- hdu 1702 ACboy needs your help again!
- 10个不太为人所知的,但实用的PHP函数
- CSS技巧: CSS隐藏文字的方法(CSS text-indent: -9999px;)
- Hadoop伪分布模式安装以及在Eclipse中运行第一个MapReduce项目
- 最近工作状态异常的原因追寻。
- js闭包的理解与用法
- 学习笔记《Servlet与JSP核心编程》1
- 利用SQL更改数据库名称
- cocos2dx3.2 win7 的android版本编译及调试
- nginx优化25条
- 网狐框架分析一 -- 150616
- odoo8 默认的create方法
- 绘图 在客户区 在窗口全区 在屏幕全区 透明画刷
- ndk交叉编译两种方式
- mysql支持表情符
- 分支-07 比较大小(10)
- Redis学习第七课:键值命令和服务器命令
- Struts2(二)局部与全局类型转换器
- IOS学习笔记65 —— ARC中__bridge, __bridge__transfer, __bridge_retained 关系
- p2p介绍