Slick(1)Introduce and Documents

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值