play中使用slick的一些代码片段

简单记录下自己第一次使用slick的蹒跚学步的过程,先说一下我用的是2.x
​详细语法可以见
http://wiki.jikexueyuan.com/project/slick-guide/query-one.html
http://thomastoye.be/2015/slick-with-play/

开始

先通过$ sbt “gen-tables” 构造tables.scala,
之后使用table中的lazy进行操作,
操作时一定要由session环境,做法一般是通过在外面包一层slick.DB.withSession { implicit session => //code }
来实现,
或者在函数中加一个隐式参数( implicit session: JdbcBackend#Session)

select数据

  • 比较大小用 <, > 等于号和不等于用===,=!=
  • filter对应where
  • map对应select中的行
  • insert一般是通过case class建立一个 然后直接insert
1
2
3
4
5
6
7
8
9
private def newOfflineUserInfos(identifier:String,partner:String,userId:Int)
:Tables.OfflineUserInfo = {
Tables.OfflineUserInfo(//slick生成的cass class
identifier=identifier,
partner = partner,
userId=userId)
}
val os=newOfflineUserInfos(identifier ,partner,0 )
Tables.offlineUserInfos.insert(os)

取出来slick的结果一般用三种方法

  • .run 感觉是去除类型里的column
  • .list 返回一个list
  • .firstoption 返回一个option

update

update就在select的基础上直接.map(_.col1, _.col2).update(val1, val2),用map拿出具体字段,然后用update修改

join

还可以用tabls.scala中的lazy值做那个表,用for foreach来操作

1
2
3
4
5
lazy val Album = new TableQuery(tag => new Album(tag))
val q1= for (a <- Album;if a.albumid<10)
yield (a.albumid,a.title,a.artistid)
q1 foreach println

进一步多表join

1
2
3
4
5
val q2 = for {
a <- Album if a.albumid < 10
t <- a.artistFk
} yield (a.albumid,a.title,t.name)
q2 foreach println

insert

insert先用之前table里的代表被插入表的那个cassclass生成一个记录,然后再inset

1
2
3
4
5
6
7
8
9
10
private def newInsert(col1:String, col2:Int)
:Tables.InsertTable = {
Tables.InsertTable(
col1=col1,
col2=col2)
}
//在要插入的地方
val s = newInsert("test", 0)
Tables.offlineUserInfos.insert(s)

delete

在select的结果那里直接delete

其他

transaction是会自动回滚的,一条指令有错,他就整个回滚

slick中只回滚和数据库有关的操作,非数据库操作不会回滚

slick可以用max min avg sum

​slick支持原生sql,具体用法见http://wiki.jikexueyuan.com/project/slick-guide/sql.html


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2015/10/13/play中使用slick的一些代码片段/