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

Slick(1)Introduce and Documents

 
阅读更多
Slick(1)Introduce and Documents

The current release is Slick 0.11.2 for Scala 2.10.0-RC1.

Supported database systems
No Oracle but

Derby/JavaDB

H2

HSQLDB/HyperSQL

Microsoft Access

MySQL

PostgreSQL

SQLite



Getting Started
Start from the Example

>git clone https://github.com/slick/slick-examples.git

>cd slick-examples

>sbt update

>sbt run

>sbt eclipse

Import this project to eclipse and start to learn.



Overview
Four steps to use this

1. Add the Slick jar and dependencies

2. Pick a driver for a particular db

import scala.slick.driver.H2Driver.simple._

import Database.threadLocalSession



3. Describe the Database schema

object Coffees extends Table[(String, Double)]("COFFEES"){

     def name = column[String]("COF_NAME", O.PrimaryKey)

     def price = column[Double]("PRICE")

     def * = name ~ price

}



4. Write queries

Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {

     Coffees.filter(_.price < 10.0).map(_.name).list

}



Dependencies
I will just make this example happen on my easy spray project.

  "com.typesafe"        %   "slick_2.10.0-RC2"        % "0.11.2",

  "org.slf4j"   %   "slf4j-nop"   % "1.6.4",

  "com.h2database"   %   "h2"   % "1.3.170",

  "org.xerial"   %   "sqlite-jdbc"   % "3.6.20",

  "mysql"       %   "mysql-connector-java"   % "5.1.13"

/*
  "org.apache.derby" % "derby" % "10.6.1.0",

  "org.hsqldb" % "hsqldb" % "2.0.0",

  "postgresql" % "postgresql" % "8.4-701.jdbc4",

  "mysql" % "mysql-connector-java" % "5.1.13"

*/



Imports


Take the example in project slick-examples/src/main/scala/scala.slick.examples.lifted.FirstExample



And make sure we do not use the master, we need to use the tag branch 0.11.2.



// Use H2Driver to connect to an H2 database

import scala.slick.driver.H2Driver.simple._

// Use the implicit threadLocalSession

import Database.threadLocalSession



Database Connection
  Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {

     …snip…

  }



Schema Definition with Forekey
  object Suppliers extends Table[(Int, String, String, String, String, String)]("SUPPLIERS") {

    def id = column[Int]("SUP_ID", O.PrimaryKey) // 1 This is the primary key column  

    def name = column[String]("SUP_NAME")   // 2

    def street = column[String]("STREET")  //3

    def city = column[String]("CITY")  //4

    def state = column[String]("STATE") //5

    def zip = column[String]("ZIP") // 6

    def * = id ~ name ~ street ~ city ~ state ~ zip

  }



  object Coffees extends Table[(String, Int, Double, Int, Int)]("COFFEES") {

    def name = column[String]("COF_NAME", O.PrimaryKey) //1

    def supID = column[Int]("SUP_ID") //2

    def price = column[Double]("PRICE") //3

    def sales = column[Int]("SALES") //4

    def total = column[Int]("TOTAL") //5

    def * = name ~ supID ~ price ~ sales ~ total

    def supplier = foreignKey("SUP_FK", supID, Suppliers)(_.id)

  }



Populating the Database
  Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {

    (Suppliers.ddl ++ Coffees.ddl).create



    Suppliers.insert(1, "Acme, Inc.", "99 Market Street", "Groundsville", "CA", "95199")

    Suppliers.insert(2, "Superior Coffee", "1 Party Place", "Mendocino", "CA", "95460")

    Suppliers.insert(3, "The High Ground", "100 Coffee Lane", "Meadows", "CA", "93966")



    Coffees.insertAll(

      ("Colombian", 1, 7.99, 0, 0),

      ("French_Roast", 3, 8.99, 0, 0),

      ("Espresso", 2, 9.99, 0, 0),

      ("Colombian_Decaf", 2, 8.99, 0, 0),

      ("French_Roast_Decaf", 1, 9.99, 0, 0))

  }



Querying
Query(TableName) foreach show up all the data in one table

    println("Coffees:")

    Query(Coffees) foreach {

      case (name, supID, price, sales, total) =>

        println("  " + name + "\t" + supID + "\t" + price + "\t" + sales + "\t" + total)

    }



    println("Manual join:")

    val q2 = for {

      c <- Coffees if c.price < 9.0    //table 1 with price condition

      s <- Suppliers if s.id === c.supID   //table 2 with join id

    } yield (c.name, s.name)

    for (t <- q2) println("  " + t._1 + " supplied by " + t._2)



    println("Join by foreign key:")

    val q3 = for {

      c <- Coffees if c.price < 9.0

      s <- c.supplier

    } yield (c.name, s.name)

    // This time we read the result set into a List

    val l3: List[(String, String)] = q3.list

    for ((s1, s2) <- l3) println("  " + s1 + " supplied by " + s2)
       println(q3.selectStatement)



select x2."COF_NAME", x3."SUP_NAME" from "COFFEES" x2, "SUPPLIERS" x3 where (x2."PRICE" < 9.0) and (x3."SUP_ID" = x2."SUP_ID")





References:
http://slick.typesafe.com/

http://slick.typesafe.com/docs/

http://slick.typesafe.com/doc/0.11.2/

http://slick.typesafe.com/doc/0.11.2/gettingstarted.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics