0
Reading Anorm 2.0         Kazuhiro Sera             @seratch           #akskscala
Anorm のコンセプトドキュメントに明確に宣言されているAnorm は ORM ではない生 JDBC はつらい、よりよい API としての Anorm APIDB アクセスの DSL は SQL がベストSQL を生成する type safe...
Anorm API 利用例 1import anorm._implicit val conn: java.sql.Connection = ...// insertSQL(“insert into emp values ({id},{name}...
Anorm API 利用例 2// selectcase class Emp(id: Pk[Int], name: String, age: Option[Int])import anorm.SqlParser._val emp: RowPar...
Anorm は Play 非依存JDBC を隠蔽した使いやすい API を提供することを目的にしていて Play 本体に依存していないコネクションやトランザクションの管理はスコープ外拙作の実例(scalikejdbc-with-anorm20....
Anorm のこれまではじまりは play-scala モジュールの機能として2010/11 play.db.sql というパッケージで開始2011/4 play.db.anorm に改名2011/10 Play20 にそのまま追加2012/1...
Play20 になって変わった点play.db.anorm から anorm に package 変更Magic が不要ということで廃止になった(やり取り)Typesafe の Maven リポジトリで配布されている( play%% anorm...
ソースコードの構成framework/src/anorm/src/main/scalaAnorm.scalaSqlParser.scalaSqlStatementParser.scalaTypeWrangler.scalaUtils.scala...
Anorm.scalaSQL(String): SqlQuery、まず SqlQuery から読むSqlQuery は暗黙の型変換で SimpleSql や BatchSql としてもふるまうので、これらも読むクエリの場合、getFilledS...
Anorm API 利用例 3case class Emp(id: Pk[Int], name: String, age: Option[Int])val sql: SqlQuery = SQL(“select * from emp where...
SqlParser.scalaSqlParser の API が RowParser を返すので、それを「 」メソッドの呼び出しで結合して使う感じSqlParser.get[T](String): RowParser[T]SqlParser.s...
Anorm API 利用例 4case class Emp(id: Pk[Int], name: String, age: Option[Int])import anorm.SqlParser._val rp: RowParser[Pk[Int...
SqlStatementParser.scala JavaTokenParsers を extends したパーザーコンビネータ な実装クラス  select id,name,age from emp where id = {id} and n...
TypeWrangler.scalaScala、Java の主要な型の scala.reflect.Manifest をつくって返すユーティリティScala でいうと Byte、Short、Char、Int、Long、Float、Double、B...
Utils.scala現状だと MayErr しかないcase class MayErr[+E, +A](e: Either[E, A])MayErr と Either は相互に暗黙の型変換Anorm.scala を見ると MayErr がかな...
play.db APIframework/src/play/src/main/scala/api/db/DB.scalaDBPlugin extends play.api.Plugin が Play の設定をもとにjava.sql.DataSo...
まとめ・感想Magic がなくなって実装がかなりシンプルになった反面、object Emp extends Magic[Emp] を定義するだけで使うことができた Emp.find( id = {id} ).on( id -> 1) のような A...
Upcoming SlideShare
Loading in...5
×

Reading Anorm 2.0

4,161

Published on

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,161
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
17
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "Reading Anorm 2.0"

  1. 1. Reading Anorm 2.0 Kazuhiro Sera @seratch #akskscala
  2. 2. Anorm のコンセプトドキュメントに明確に宣言されているAnorm は ORM ではない生 JDBC はつらい、よりよい API としての Anorm APIDB アクセスの DSL は SQL がベストSQL を生成する type safe DSL は誤った方向性だORM と格闘するより SQL 書いた方がコスト小さい
  3. 3. Anorm API 利用例 1import anorm._implicit val conn: java.sql.Connection = ...// insertSQL(“insert into emp values ({id},{name},{age})”) .on(‘id -> 1, ‘name -> “Andy”, ‘age -> 19) .executeUpdate()// updateSQL(“update emp set name = {name} where id = {id}”) .on(‘id -> 1, ‘name -> “Brian”) .executeUpdate()
  4. 4. Anorm API 利用例 2// selectcase class Emp(id: Pk[Int], name: String, age: Option[Int])import anorm.SqlParser._val emp: RowParser[Emp] = get[Pk[Int]](“id”) ~ get[String](“name”) ~ get[Option[Int]](“age”) map { case id ~ name ~ age => Emp(id, name, age)}val emps: List[Emp] = SQL(“select * from emp”).as(emp.*)val emp: Option[Emp] = SQL(“select * from emp where id = {id}”) .on(‘id -> 1).as(emp.singleOpt)
  5. 5. Anorm は Play 非依存JDBC を隠蔽した使いやすい API を提供することを目的にしていて Play 本体に依存していないコネクションやトランザクションの管理はスコープ外拙作の実例(scalikejdbc-with-anorm20.g8)Play アプリだけでなく、ちょっとした DB アクセスが必要な場合にも便利に使える
  6. 6. Anorm のこれまではじまりは play-scala モジュールの機能として2010/11 play.db.sql というパッケージで開始2011/4 play.db.anorm に改名2011/10 Play20 にそのまま追加2012/1 大幅変更(Magic廃止など)最近はあまり変更はされていない感じ
  7. 7. Play20 になって変わった点play.db.anorm から anorm に package 変更Magic が不要ということで廃止になった(やり取り)Typesafe の Maven リポジトリで配布されている( play%% anorm % 2.0 )Play 本体にある play.db API でトランザクション管理が提供されている(play-scala にはない)
  8. 8. ソースコードの構成framework/src/anorm/src/main/scalaAnorm.scalaSqlParser.scalaSqlStatementParser.scalaTypeWrangler.scalaUtils.scalaファイル構成はそのうち整理されるかも
  9. 9. Anorm.scalaSQL(String): SqlQuery、まず SqlQuery から読むSqlQuery は暗黙の型変換で SimpleSql や BatchSql としてもふるまうので、これらも読むクエリの場合、getFilledStatement でバインド変数を setして as(...) 内部で executeQuery() の流れpackage object がここにいるのはちょっと行儀よくない
  10. 10. Anorm API 利用例 3case class Emp(id: Pk[Int], name: String, age: Option[Int])val sql: SqlQuery = SQL(“select * from emp where id = {id}”)val query: SimpleSql[Row] = sql.on(‘id -> 1)val stream: Stream[Row] = query.apply()stream map { row => Emp(row[Pk[Int]]("id"), row[String]("name"), row[Option[Int]]("age"))}
  11. 11. SqlParser.scalaSqlParser の API が RowParser を返すので、それを「 」メソッドの呼び出しで結合して使う感じSqlParser.get[T](String): RowParser[T]SqlParser.str(String): RowParser[String]中置型 case class [+A, +B](_1: A, _2: B)RowParser[A]# [B](RowParser[B]): RowParser[A B]
  12. 12. Anorm API 利用例 4case class Emp(id: Pk[Int], name: String, age: Option[Int])import anorm.SqlParser._val rp: RowParser[Pk[Int] ~ String ~ Option[Int]] = get[Pk[Int]](“id”) ~ get[String](“name”) ~ get[Option[Int]](“age”)val emp: RowParser[Emp] = rp map { case id ~ name ~ age => Emp(id, name, age)}val opt: ResultSetParser[Option[Emp]] = emp.singleOptval list: ResultSetParser[List[Emp]] = emp.*
  13. 13. SqlStatementParser.scala JavaTokenParsers を extends したパーザーコンビネータ な実装クラス select id,name,age from emp where id = {id} and name = {name} のような SQL からバインド変数名({id}、 {name})を順序付きで取り出す処理 2.0 時点では Sql.sql(String) でのみ使用
  14. 14. TypeWrangler.scalaScala、Java の主要な型の scala.reflect.Manifest をつくって返すユーティリティScala でいうと Byte、Short、Char、Int、Long、Float、Double、Boolean、Null、Unit が定義されている、対応するJava の型も同様2.0 時点では使ってないようだが・・?
  15. 15. Utils.scala現状だと MayErr しかないcase class MayErr[+E, +A](e: Either[E, A])MayErr と Either は相互に暗黙の型変換Anorm.scala を見ると MayErr がかなり使われている
  16. 16. play.db APIframework/src/play/src/main/scala/api/db/DB.scalaDBPlugin extends play.api.Plugin が Play の設定をもとにjava.sql.DataSource を返すobject DB は内部的に DBApi(in DBPlugin)からjava.sql.Connection をもらって withConnection、withTransaction ブロックを提供する
  17. 17. まとめ・感想Magic がなくなって実装がかなりシンプルになった反面、object Emp extends Magic[Emp] を定義するだけで使うことができた Emp.find( id = {id} ).on( id -> 1) のような API がなくなったScala の DB アクセスライブラリの中では、かなり使い勝手はよい API になっていると思うので、Play アプリ以外でも使ってみてください
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×