`
sillycat
  • 浏览: 2566694 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Slick(2)3 Working Types

 
阅读更多
Slick(2)3 Working Types
1. Lifted Embedding

The name Lifted Embedding refers to the fact that you are not working with Standard Scala types, but with types that are lifted into a scala.sclick.liftted.Req type constructor.
var l: Lit[Coffee] *
val l2 = l.filter(_.price > 8.0).map(_.name)      

=>

object Coffees extends Table[(String, Int, Double, Int, Int)]("COFFEES"){
     …snip….
}

val q = Query(Coffees)
val q2 = q.filter(_.price > 8.0).map(_.name)
              Rep[Double]   Rep[Double]   Rep[String]

Tables
Defined a table at first.

Mapped Tables
..snip…

Constraints
foreignKey

object Suppliers extends Table[(Int, String, String, String,String, String)]("SUPPLIERS"){
     def id = column[Int]("SUP_ID", O.PrimaryKey)
     …snip...
}

object Coffees extends Table[(String, Int, Double, Int, Int)]("COFFEES"){
     def supID = column[Int]("SUP_ID")
     …snip…
     def supplier = foreignKey("SUP_FK", supID, Suppliers)(_.id)
}

A primary key constraint can be defined in a similar fashion by adding a method that calls primaryKey.

Object A extends Table[(Int, Int)]("a") {
     def k1 = column[Int]("k1")
     def k2 = column[Int]("k2")
    
     def * = k1 ~ k2
     def pk = primaryKey("pk_a",(k1, k2))
}

Object A extends Table[(Int, Int)]("a") {
     def k1 = column[Int]("k1")
     def k2 = column[Int]("k2")
     def * = k1 ~ k2
     def idx = index("idx_a", (k1, k2), unique=true)
}

Data Definition Language(DDL)
DDL statements for a table can be created with its ddl method. We can create and drop table with this function.
val ddl = Coffees.ddl ++ Suppliers.ddl
db withSession {
     ddl.create
     …snip…
     ddl.drop
}

We can see the SQL with these statements>
    ddl.createStatements.foreach(println)
    ddl.dropStatements.foreach(println)

Output:
create table "SUPPLIERS" ("SUP_ID" INTEGER NOT NULL PRIMARY KEY,"SUP_NAME" VARCHAR NOT NULL,"STREET" VARCHAR NOT NULL,"CITY" VARCHAR NOT NULL,"STATE" VARCHAR NOT NULL,"ZIP" VARCHAR NOT NULL)
create table "COFFEES" ("COF_NAME" VARCHAR NOT NULL PRIMARY KEY,"SUP_ID" INTEGER NOT NULL,"PRICE" DOUBLE NOT NULL,"SALES" INTEGER NOT NULL,"TOTAL" INTEGER NOT NULL)
alter table "COFFEES" add constraint "SUP_FK" foreign key("SUP_ID") references "SUPPLIERS"("SUP_ID") on update NO ACTION on delete NO ACTION
alter table "COFFEES" drop constraint "SUP_FK"
drop table "SUPPLIERS"
drop table "COFFEES"

Expressions
…snip…

2. Direct Embedding
we did not use that in my project.

3. Plain SQL Queries
First of all the imports are different.
import scala.slick.session.Database
import Database.threadLocalSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}

Import scala.slick.jdbc.GetResult and import scala.sclick.jdbc.StaticQuery for Q.

The most important class for Plain SQL queries is scala.slick.jdbc.StaticQuery which gets imported as Q for more convenient use.
// Case classes for our data
case class Supplier(id: Int, name: String, street: String, city: String, state: String, zip: String)
case class Coffee(name: String, supID: Int, price: Double, sales: Int, total: Int)

DDL/DML Statements

  Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {
    // Create the tables, including primary and foreign keys
    Q.updateNA("create table suppliers(" +
      "id int not null primary key, " +
      "name varchar not null, " +
      "street varchar not null, " +
      "city varchar not null, " +
      "state varchar not null, " +
      "zip varchar not null)").execute
    Q.updateNA("create table coffees(" +
      "name varchar 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))").execute
           …snip…
  }

Q.u is StaticQuery.updateNA("")
// Insert some suppliers
(Q.u + "insert into suppliers values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199')").execute
(Q.u + "insert into suppliers values(49, 'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', '95460')").execute
(Q.u + "insert into suppliers values(150, 'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', '93966')").execute

We can use the special concatenation operator +? to add a bind variable to a query string.
    def insert(c: Coffee) = (Q.u + "insert into coffees values (" +? c.name +
      "," +? c.supID + "," +? c.price + "," +? c.sales + "," +? c.total + ")").execute

    // Insert some coffees
    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)).foreach(insert)

Query Statements
// Result set getters
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.<<))

println("Coffees:")
Q.queryNA[Coffee]("select * from coffees") foreach { c =>
      println("  " + c.name + "\t" + c.supID + "\t" + c.price + "\t" + c.sales + "\t" + c.total)
}

There are predefined GetResult implicates for the standard JDBC types.
The first one uses the explicit PositionedResult methods nextInt and nextString Int or String.
The second one uses the shortcut method << which returns a value of whatever type is expected at this place.

query which takes two type parameters, one for the query parameters and one for the results set rows. Similarly for update and updateNA.
    println("Manual join:")
    val q2 = Q.query[Double, (String, String)]("""
      select c.name, s.name
      from coffees c, suppliers s
      where c.price < ? and s.id = c.sup_id
    """)
    // This time we read the result set into a List
    val l2 = q2.list(9.0)
    for (t <- l2) println("  " + t._1 + " supplied by " + t._2)

    valsupplierById = Q[Int, Supplier] + "select * from suppliers where id = ?"
    println("Supplier #49: " + supplierById(49).first)

String Interpolation
import Q.interpolation
    def coffeeByName(name: String) = sql"select * from coffees where name = $name".as[Coffee]
    println("Coffee Colombian: " + coffeeByName("Colombian").first.name)
    println("Coffee Colombian: " + coffeeByName("Colombian").firstOption)

sqlu seems to sql and update the table.
    def deleteCoffee(name: String) = sqlu"delete from coffees where name = $name".first
    val rows = deleteCoffee("Colombian")
    println(s"Deleted $rows rows")
    println("Coffee Colombian: " + coffeeByName("Colombian").firstOption)

References:
http://slick.typesafe.com/doc/0.11.2/index.html
http://slick.typesafe.com/doc/0.11.2/lifted-embedding.html
http://slick.typesafe.com/doc/0.11.2/direct-embedding.html
http://slick.typesafe.com/doc/0.11.2/sql.html
分享到:
评论

相关推荐

    slick2d-examples-1.0.1.zip

    《Slick2D游戏开发库详解与实例演示》 Slick2D,作为一个基于Java的2D游戏开发库,为开发者提供了丰富的功能和便捷的API,使得2D游戏的创建变得简单而高效。这个名为“slick2d-examples-1.0.1.zip”的压缩包,包含...

    Slick2D Game Development

    A simple guide, packed with tutorials that ease you into learning about the Slick game workflow and Slick game library. Who this book is written for If you are a game programmer who would like to ...

    essential-slick-3

    根据提供的信息,我们可以总结出以下相关知识点,这些知识点主要聚焦于"Slick-3"这一数据库访问库的基础使用方法以及如何通过Scala语言进行高效的数据查询与操作。 ### Slick-3 简介 Slick-3 是一个用于 Scala 的...

    钓鱼女孩,使用 Slick 2d 的简单钓鱼游戏。

    钓鱼女孩,使用 Slick 2d 的简单钓鱼游戏。 文件 Fishing-Girl-master.zip 包含以下条目。 .classpath/*w w w . j a va 2s . com*/ .gitignore .project .settings/org.eclipse.jdt.core.prefs OpenAL32.dll data/...

    SLICK轮播图插件

    &lt;div&gt;&lt;img src="image2.jpg" alt="Image 2"&gt; &lt;div&gt;&lt;img src="image3.jpg" alt="Image 3"&gt; ``` 接下来,为了使轮播图生效,需要在页面中引入SLICK插件的CSS和JavaScript文件。通常,这些文件会位于项目的`dist`...

    SlickEdit v27 linux 64

    《SlickEdit v27 Linux 64 专业版:高效编程的新篇章》 SlickEdit v27 是一款专为Linux 64位操作系统设计的专业级代码编辑器,它以其强大的功能和高效的编程体验而备受程序员的青睐。在这款软件中,开发者可以享受...

    SlickEdit+Yagarto 搭建 Cortex M3 编译环境

    2. **编译并运行**:使用SlickEdit中的“Build”菜单来编译项目,编译成功后,将生成的目标文件下载到目标板上进行测试。 #### 五、总结 通过上述步骤,我们可以使用SlickEdit和Yagarto构建一个高效、稳定的Cortex...

    SlickEdit Gadgets 2 for VS2005

    《SlickEdit Gadgets 2 for VS2005:高效编程的实用工具》 在软件开发领域,Visual Studio 2005是一款备受推崇的集成开发环境(IDE),为程序员提供了丰富的功能和便利。然而,为了进一步提升开发效率,许多开发者...

    slickedit 2014 v19 linux 32bit part2

    解压方法step 1三个文件合成一个cat slickedit_linux_32bit.tar.gz.a* &gt;slickedit.tar.gz step 2 tar xzvf slickedit.tar.gz slickedit 2014 v19 linux 32位版的 已经和谐了,step1:解压后执行vsinst安装,安装过程...

    SlickEdit 13.0.0.0 绿色版 + SlickEdit 12.0.3 汉化包

    《SlickEdit 13.0.0.0 绿色版与SlickEdit 12.0.3汉化包详解》 SlickEdit是一款备受程序员喜爱的文本编辑器,以其强大的功能和高效的代码编辑体验闻名。在这个压缩包中,我们得到了两个版本的SlickEdit:13.0.0.0的...

    感觉最好用的轮播插件slick slickSlider1.8.zip

    它使用高效的JavaScript和CSS3动画,保证了在不同设备上流畅运行,同时减少了对CPU的占用。对于大型项目或者高流量网站,这样的性能优化至关重要,可以提升用户体验,降低服务器压力。 再者,Slick提供了丰富的选项...

    jQuery幻灯片插件slick实例

    3. **动画效果**:Slick提供了多种过渡动画,如淡入淡出、左右滑动等,让切换过程更加流畅自然。 4. **导航箭头和分页**:可以自定义添加向前向后导航箭头和分页指示器,方便用户浏览幻灯片。 5. **无限循环**:...

    slickedit 2014 v19 linux 32bit part3

    解压方法step 1三个文件合成一个cat slickedit_linux_32bit.tar.gz.a* &gt;slickedit.tar.gz step 2 tar xzvf slickedit.tar.gz slickedit 2014 v19 linux 32位版的 已经和谐了,step1:解压后执行vsinst安装,安装过程...

    slickedit2010 part3

    slickedit2010Windows版本安装文件和破解,验证可用

    Slick2D Android游戏示例_java_代码_下载

    3. **输入处理**:Slick2D允许开发者监听和响应用户的触摸或键盘输入。在Android上,这通常涉及`Input`接口,你可以通过它来检测点击、滑动等手势,实现游戏的交互逻辑。 4. **游戏逻辑与更新**:游戏的核心逻辑...

    block-slick:与Slick3兼容的Slick2阻塞API

    Block-Slick是一个专门为Scala开发的库,它提供了与Slick3兼容的Slick2阻塞API。Slick是一个强大的、类型安全的SQL库,用于在Scala应用程序中操作关系数据库。Slick3是其最新的版本,引入了许多改进和新特性,但同时...

    slickedit 2012 17.0.2 windows 32位 和谐版

    slickedit 2012 17.0.2 windows 32位 和谐版,大家都懂的。 详细过程参见http:// zhiwei.li /text/2012/06/slickedit-2012/comment-page-1/

    slick.min.js

    slick.min.js

    slickedit_使用

    2. 隐藏选中的某个区域 SlickEdit 也提供了隐藏选中的某个区域的功能,这可以帮助开发者快速隐藏不需要的代码。操作步骤为:先选取一块区域,然后选择菜单 View-&gt; Hide Selection。 3. 隐藏注释内容 SlickEdit ...

    Slick Edit v21简单配置,让你看得更舒服,都是截图

    3. **代码高亮**:Slick Edit支持多种语言的代码高亮,确保代码在视觉上清晰易懂。你可以根据自己的喜好调整高亮样式,例如增加或减少背景对比度。 4. **自动完成与提示**:开启自动完成功能,当输入代码时,Slick ...

Global site tag (gtag.js) - Google Analytics