Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Doma2 with Kotlin
【7/9(土)】Doma勉強会 in 東京
@yy_yank
          こいつです
          ・viとサクラエディタ好き
          ・小物SIer
          ・JavaとKotlinが好き
ヤンク(@yy_yank)
自己紹介
とつぜんですが
ワタクシ、
Doma2の
コントリビューター
なんです
fix typo(ドヤッ)
はい、
すいませんでした
with
with
with
with
Doma2、Kotlinでも
使えるよ!!!の話
(一応・・・) Doma とは
・めっちゃ良いORM
・Domain Oriented Database MApping Framework
・Annotation Processingでのコンパイルチェック素敵
・JRE 8以上でうごく
・2...
(一応・・・) Kotlinとは
・JVM言語
・JetBrains製
・Gradleスクリプトも書ける(ようになる)
・Spring Initializrでも選択可能
・Null Safety(らしい)
・ScalaとGroovyのいいとこど...
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
Entity
@Entity(immutable = true)
data class Person(
@Id
@GeneratedValue(strategy = GenerationType.
IDENTITY)
val id: Int? ...
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
・
Embeddable
package sample
import org.seasar.doma.Embeddable
@Embeddable
data class Address(val city: String, val
street:...
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
package sample
import org.seasar.doma.Domain
@Domain(valueType = String::class)
data class Name(val value: String)
Domain
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
Dao
package sample
import org.seasar.doma.*
import org.seasar.doma.jdbc.Result
@Dao(config = AppConfig::class)
interface P...
@Dao(config = AppConfig::class)
interface PersonDao {
@Script
fun create()
@Script
fun drop()
Dao
@Select
fun selectById(@ParameterName("id") id:
Int): Person
@Insert
fun insert(person: Person): Result<Person>
Dao
@Update
fun update(person: Person): Result<Person>
@Delete
fun delete(person: Person): Result<Person>
Dao
特に言うことなし
(別にKotlinじゃなくても)
コードがシンプルでキレイ
あえていうならgettter/setterが消
えてLombokぐらいの
活躍はしている!
コードは全て
https://github.
com/domaframework/kotlin-sample
から拝借しました!
DomaのKotlinサポートのページに詳し
く指針が出ているので迷うことなし!
http://doma.readthedocs.
io/ja/stable/kotlin-support/
Kotlinサポート
ざっくり言うと
・data class使おう
・イミュータブルなクラスにしよう
・コンストラクタは1つだけにしよう
・kaptにハマったら@DaoはJavaにするなど
混在させるのもアリ
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
・kaptはJSR269をKotlinでも使えるようにしてくれる
コンパイルツール(個人的にはaptってやめて欲しい名前)
・Doma 2のAnnotation Processingに対応している
・以前のツラミ->backpaper0さんの資...
kaptのツラミ(backpaper0さん資料抜粋)
・少なくとも1つ注釈処理のつくJavaクラスが必要問題
→解消されたっぽい!
・arg0、arg1問題
→@ParameterNameで解消
多分これのおかげです(よね?)
kaptのツラミ
GitHubのissueにもあったのでこれで間違いなさそう
・issue
https://github.com/domaframework/doma/issues/129
・javadoc
http://doma.seasar.
org/api...
@Select
fun selectById(@ParameterName("id") id:
Int): Person
kaptのツラミ
@ParameterNameによりarg1、
arg2...問題が解消された
アジェンダ
Doma2
・Entity
・Embeddable
・Domain
・Dao
Kotlin
・kapt
・java.util.stream.Stream
・KotlinはJDK6対応
・JDK8対応はまだらしい
・でもボクはJavaでいう
@Select
R select(Integer id, Function<Stream<T>, R> mapper)した
い!!!!
java.util.s...
・KotlinはJDK6対応
・JDK8対応はまだらしい
・でもボクはJavaでいう
@Select
R select(Integer id, Function<Stream<T>, R> mapper)した
い!!!!
ということで検証
ja...
 結論:出来た
(なんでか分かんないけ
ど普通に動くっぽい)
 結論:出来た
(でもKotlinからStream
API使いにくい)
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func :
java.util.function.Function<java...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, Function {
it.map {it.name}.findFirst().orElseThrow {...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, Function {
it.map {it.name}.findFirst().orElseThrow {...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, Function {
it.map {it.name}.findFirst().orElseThrow {...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, Function {
it.map {it.name}.findFirst().orElseThrow {...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, Function {
it.map {it.name}.findFirst().orElseThrow {...
うん。。
でもどうせなら
Kotlin的には。。
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func : (person : Person) -> Name): Name...
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func : (person : Person) -> Name): Name...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, {it.name})
Assert.assertEquals(Name("SMITH"), personN...
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, {it.name})
Assert.assertEquals(Name("SMITH"), personN...
エラー: [DOMA4247] @Selectのstrategy要素に
SelectStrategyType.STREAMを設定した場合、
Function型のパラメータが必要です。 at sample.
PersonDao.selectByI...
Domaさん賢い!!!!
#そこじゃない
・Doma2はKotlinでも普通に使える
・手軽な感じでコード書くには良いのかも
・KotlinからStream APIは使いにくい
(あんまりDoma2関係ない)
・でもJavaで使ってもDoma2は充分気持ち良い
・お世辞じゃなくDoma...
Domaは素敵!!!!
Doma2 with Kotlin
Doma2 with Kotlin
Doma2 with Kotlin
Upcoming SlideShare
Loading in …5
×

Doma2 with Kotlin

939 views

Published on

2016/07/09 Doma勉強会 in 東京のLT資料です

Published in: Technology
  • Be the first to comment

Doma2 with Kotlin

  1. 1. Doma2 with Kotlin 【7/9(土)】Doma勉強会 in 東京 @yy_yank
  2. 2.           こいつです           ・viとサクラエディタ好き           ・小物SIer           ・JavaとKotlinが好き ヤンク(@yy_yank) 自己紹介
  3. 3. とつぜんですが ワタクシ、 Doma2の コントリビューター なんです
  4. 4. fix typo(ドヤッ)
  5. 5. はい、 すいませんでした
  6. 6. with
  7. 7. with
  8. 8. with
  9. 9. with Doma2、Kotlinでも 使えるよ!!!の話
  10. 10. (一応・・・) Doma とは ・めっちゃ良いORM ・Domain Oriented Database MApping Framework ・Annotation Processingでのコンパイルチェック素敵 ・JRE 8以上でうごく ・2Way-SQL ※NASAではない
  11. 11. (一応・・・) Kotlinとは ・JVM言語 ・JetBrains製 ・Gradleスクリプトも書ける(ようになる) ・Spring Initializrでも選択可能 ・Null Safety(らしい) ・ScalaとGroovyのいいとこどり(らしい) ※ボクは昔のロゴの方が好き
  12. 12. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  13. 13. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  14. 14. Entity @Entity(immutable = true) data class Person( @Id @GeneratedValue(strategy = GenerationType. IDENTITY) val id: Int? = null, val name: Name, val age: Int?, val address: Address, @Version val version: Int = -1)
  15. 15. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  16. 16. ・ Embeddable package sample import org.seasar.doma.Embeddable @Embeddable data class Address(val city: String, val street: String)
  17. 17. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  18. 18. package sample import org.seasar.doma.Domain @Domain(valueType = String::class) data class Name(val value: String) Domain
  19. 19. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  20. 20. Dao package sample import org.seasar.doma.* import org.seasar.doma.jdbc.Result @Dao(config = AppConfig::class) interface PersonDao { @Script fun create() @Script fun drop() @Select fun selectById(@ParameterName("id") id:Int): Person @Insert fun insert(person: Person): Result<Person> @Update fun update(person: Person): Result<Person> @Delete fun delete(person: Person): Result<Person> }
  21. 21. @Dao(config = AppConfig::class) interface PersonDao { @Script fun create() @Script fun drop() Dao
  22. 22. @Select fun selectById(@ParameterName("id") id: Int): Person @Insert fun insert(person: Person): Result<Person> Dao
  23. 23. @Update fun update(person: Person): Result<Person> @Delete fun delete(person: Person): Result<Person> Dao
  24. 24. 特に言うことなし
  25. 25. (別にKotlinじゃなくても) コードがシンプルでキレイ
  26. 26. あえていうならgettter/setterが消 えてLombokぐらいの 活躍はしている!
  27. 27. コードは全て https://github. com/domaframework/kotlin-sample から拝借しました!
  28. 28. DomaのKotlinサポートのページに詳し く指針が出ているので迷うことなし! http://doma.readthedocs. io/ja/stable/kotlin-support/
  29. 29. Kotlinサポート ざっくり言うと ・data class使おう ・イミュータブルなクラスにしよう ・コンストラクタは1つだけにしよう ・kaptにハマったら@DaoはJavaにするなど 混在させるのもアリ
  30. 30. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  31. 31. ・kaptはJSR269をKotlinでも使えるようにしてくれる コンパイルツール(個人的にはaptってやめて欲しい名前) ・Doma 2のAnnotation Processingに対応している ・以前のツラミ->backpaper0さんの資料 http://backpaper0.github.io/ghosts/kotlin-doma.html ・Kotlinの最新version 1.0.3で改善されたりしてる ・Doma 2としてもサポートしてくれていて ツラミ減 kapt
  32. 32. kaptのツラミ(backpaper0さん資料抜粋)
  33. 33. ・少なくとも1つ注釈処理のつくJavaクラスが必要問題 →解消されたっぽい! ・arg0、arg1問題 →@ParameterNameで解消 多分これのおかげです(よね?) kaptのツラミ
  34. 34. GitHubのissueにもあったのでこれで間違いなさそう ・issue https://github.com/domaframework/doma/issues/129 ・javadoc http://doma.seasar. org/apidocs/org/seasar/doma/ParameterName.html kaptのツラミ
  35. 35. @Select fun selectById(@ParameterName("id") id: Int): Person kaptのツラミ @ParameterNameによりarg1、 arg2...問題が解消された
  36. 36. アジェンダ Doma2 ・Entity ・Embeddable ・Domain ・Dao Kotlin ・kapt ・java.util.stream.Stream
  37. 37. ・KotlinはJDK6対応 ・JDK8対応はまだらしい ・でもボクはJavaでいう @Select R select(Integer id, Function<Stream<T>, R> mapper)した い!!!! java.util.stream.Stream
  38. 38. ・KotlinはJDK6対応 ・JDK8対応はまだらしい ・でもボクはJavaでいう @Select R select(Integer id, Function<Stream<T>, R> mapper)した い!!!! ということで検証 java.util.stream.Stream
  39. 39.  結論:出来た (なんでか分かんないけ ど普通に動くっぽい)
  40. 40.  結論:出来た (でもKotlinからStream API使いにくい)
  41. 41. @Select(strategy = SelectType.STREAM) fun selectById( @ParameterName("id") id:Int, func : java.util.function.Function<java.util.stream. Stream<Person>, Name>): Name Dao
  42. 42. @Test fun test2() { tm.required { val personName = dao.selectById(1, Function { it.map {it.name}.findFirst().orElseThrow { Exception("あってほしい!") } }) Assert.assertEquals(Name("SMITH"), personName) } } Test Code
  43. 43. @Test fun test2() { tm.required { val personName = dao.selectById(1, Function { it.map {it.name}.findFirst().orElseThrow { Exception("あってほしい!") } }) Assert.assertEquals(Name("SMITH"), personName) } } Test Code SAM(Single Abstract Method)
  44. 44. @Test fun test2() { tm.required { val personName = dao.selectById(1, Function { it.map {it.name}.findFirst().orElseThrow { Exception("あってほしい!") } }) Assert.assertEquals(Name("SMITH"), personName) } } Test Code Function#applyを Function{}とかける
  45. 45. @Test fun test2() { tm.required { val personName = dao.selectById(1, Function { it.map {it.name}.findFirst().orElseThrow { Exception("あってほしい!") } }) Assert.assertEquals(Name("SMITH"), personName) } } Test Code it = Stream<Person> stream -> stream と思ってくれれば。
  46. 46. @Test fun test2() { tm.required { val personName = dao.selectById(1, Function { it.map {it.name}.findFirst().orElseThrow { Exception("あってほしい!") } }) Assert.assertEquals(Name("SMITH"), personName) } } Test Code Javaで書くなら stream -> stream .map(person -> person.getName()) .findFirst().orElseThrow(()-> throw new Exception(“あってほしい!”)
  47. 47. うん。。
  48. 48. でもどうせなら Kotlin的には。。
  49. 49. @Select(strategy = SelectType.STREAM) fun selectById( @ParameterName("id") id:Int, func : (person : Person) -> Name): Name Dao
  50. 50. @Select(strategy = SelectType.STREAM) fun selectById( @ParameterName("id") id:Int, func : (person : Person) -> Name): Name Dao ここをこうして
  51. 51. @Test fun test2() { tm.required { val personName = dao.selectById(1, {it.name}) Assert.assertEquals(Name("SMITH"), personName) } } Test Code
  52. 52. @Test fun test2() { tm.required { val personName = dao.selectById(1, {it.name}) Assert.assertEquals(Name("SMITH"), personName) } } Test Code こうじゃ
  53. 53. エラー: [DOMA4247] @Selectのstrategy要素に SelectStrategyType.STREAMを設定した場合、 Function型のパラメータが必要です。 at sample. PersonDao.selectById エラー1個
  54. 54. Domaさん賢い!!!! #そこじゃない
  55. 55. ・Doma2はKotlinでも普通に使える ・手軽な感じでコード書くには良いのかも ・KotlinからStream APIは使いにくい (あんまりDoma2関係ない) ・でもJavaで使ってもDoma2は充分気持ち良い ・お世辞じゃなくDoma2は素敵 ・対応の早さ、柔軟さも素敵 まとめ
  56. 56. Domaは素敵!!!!

×