Contenu connexe Similaire à 歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech (20) Plus de Kazuhiro Sera (20) 歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech5. ミ ヽヽヽリリノノノノ
彡ミイ  ̄ ̄'` ̄ヾミ
彡ミi ) ;|ミ
彡ミ〉 _,,,,,,,,, i,i ,,,,,_イミ JDBC と言ったな、
rミi _-・- l-・-、v
{6〈`┬ 、_」_ イ あれは嘘だ。
ヾ| ( ,-ー-、) |
\ `- ͡-´ノ 、 ' ’
/i\ __ノ - ∩_____ ’
/\_ _ノ\ ( イ___ヨ - パッ
(_Y ヽノ )イ͡ニ ,ノ
( )____/ `ー-ー´
ー-',..-'ー.-,ー!..ー,,-._ー.,-ー.,-ー-...,,____
l | i i ''i,,_
7. ScalikeJDBC
- Scala の DB アクセスライブラリ
- “仕事で使っても詰まない”
- SQL 書ける、柔軟性、拡張性、スピー
ディなバグ対応・リリース、日本語
- Slick、Squeryl ほど有名じゃないけ
ど、結構イケる感じです
8. DSL で書いた例
import scalikejdbc._, SQLInterpolation._
val memberId = 123
val member = DB readOnly { implicit session =>
withSQL {
select.from(Member as m)
.where.eq(m.id, memberId).and.isNull(m.deletedAt)
}.map(Member(m)).single.apply()
}
9. 生 SQL も書けるよ
import scalikejdbc._, SQLInterpolation._
val memberId = 123
val member = DB readOnly { implicit session =>
sql”””select id, name from member
where id = ${memberId} and deleted_at is null”””
.map(Member(m)).single.apply()
}
10. Get things done
- わかりやすくて、ハマりにくい
- 独自のノウハウを探しまわる必要なし
- 1 人目のちゃんと使える人の確保が容易
(Scala の基本と SQL のみ)
- Cookbook(日本語)販売中
15. ほぼそのまま!
import scalikejdbc._, SQLInterpolation._, async._
val memberId = 123
val member = AsyncDB withPool { implicit session =>
withSQL {
select.from(Member as m)
.where.eq(m.id, memberId).and.isNull(m.deletedAt)
}.map(Member(m)).single.future()
}
16. Tx は for 式で
val name = “Typesafe”
val programmers = Seq(“Alice”, “Bob”, “Chris”)
val resultFuture = AsyncDB localTx { implicit tx =>
for {
company <- Company.create(name)
employees <- company.hireAll(programmers)
} yield ()
}
20. Most cases?
- うちのアプリ、実際 Servlet + JDBC で
十分さばけてる(知ってた)
- Reactive? C10K? 何それおいしいの?
- 実は普通の管理画面作りたいだけ
- Java は得意だけど今更の Java 感
23. Play2?
Play2 は発展途上 & Reactive 指向。
見た目から Play1/Rails 的なものを期待して
ミスマッチになっていないか?
管理画面つくるの Play2 で本当に楽?
25. ORM もあるよ
case class Developer(id: Long, groupId: Opion[Long],
group: Option[Group] = None, skills: Seq[Skill] = Nil)
object Developer extends SkinnyCRUDMapper[Developer] {
belongsTo[Group](Group, (d, g) => d.copy(group = g)).byDefault
hasManyThrough[Skill](DeveloperSkill, Skill, (d, skills) => d.coply(skills = skills))
def extract ...
}
Developer.findAll()
Developer.findById(123)
Developer.createWithAttributes(params.permit(“id”, “groupId”))
Developer.updateById(123).withAttributes(attrs)
Developer.deleteById(123)
26. Thanks
- 非同期 JDBC なんてなかったんやー
- ScalikeJDBC のご紹介
- ScalikeJDBC-Async のご紹介
- Skinny Framework のご紹介