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
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
本文介绍如何使用Slick 1.0进行数据库操作,包括配置依赖、定义数据库模式、插入数据及执行查询等核心步骤,并提供了一个使用H2数据库的例子。
531

被折叠的 条评论
为什么被折叠?



