SlideShare une entreprise Scribd logo
1  sur  59
Télécharger pour lire hors ligne
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以上でうごく
・2Way-SQL
※NASAではない
(一応・・・) 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? = null,
val name: Name,
val age: Int?,
val address: Address,
@Version
val version: Int = -1)
アジェンダ
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: String)
アジェンダ
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 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>
}
@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さんの資料
http://backpaper0.github.io/ghosts/kotlin-doma.html
・Kotlinの最新version 1.0.3で改善されたりしてる
・Doma 2としてもサポートしてくれていて
ツラミ減
kapt
kaptのツラミ(backpaper0さん資料抜粋)
・少なくとも1つ注釈処理のつくJavaクラスが必要問題
→解消されたっぽい!
・arg0、arg1問題
→@ParameterNameで解消
多分これのおかげです(よね?)
kaptのツラミ
GitHubのissueにもあったのでこれで間違いなさそう
・issue
https://github.com/domaframework/doma/issues/129
・javadoc
http://doma.seasar.
org/apidocs/org/seasar/doma/ParameterName.html
kaptのツラミ
@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.stream.Stream
・KotlinはJDK6対応
・JDK8対応はまだらしい
・でもボクはJavaでいう
@Select
R select(Integer id, Function<Stream<T>, R> mapper)した
い!!!!
ということで検証
java.util.stream.Stream
 結論:出来た
(なんでか分かんないけ
ど普通に動くっぽい)
 結論:出来た
(でもKotlinからStream
API使いにくい)
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func :
java.util.function.Function<java.util.stream.
Stream<Person>, Name>): Name
Dao
@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
@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)
@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{}とかける
@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
と思ってくれれば。
@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(“あってほしい!”)
うん。。
でもどうせなら
Kotlin的には。。
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func : (person : Person) -> Name): Name
Dao
@Select(strategy = SelectType.STREAM)
fun selectById(
@ParameterName("id") id:Int,
func : (person : Person) -> Name): Name
Dao
ここをこうして
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, {it.name})
Assert.assertEquals(Name("SMITH"), personName)
}
}
Test Code
@Test fun test2() {
tm.required {
val personName = dao.selectById(1, {it.name})
Assert.assertEquals(Name("SMITH"), personName)
}
}
Test Code
こうじゃ
エラー: [DOMA4247] @Selectのstrategy要素に
SelectStrategyType.STREAMを設定した場合、
Function型のパラメータが必要です。 at sample.
PersonDao.selectById
エラー1個
Domaさん賢い!!!!
#そこじゃない
・Doma2はKotlinでも普通に使える
・手軽な感じでコード書くには良いのかも
・KotlinからStream APIは使いにくい
(あんまりDoma2関係ない)
・でもJavaで使ってもDoma2は充分気持ち良い
・お世辞じゃなくDoma2は素敵
・対応の早さ、柔軟さも素敵
まとめ
Domaは素敵!!!!

Contenu connexe

Tendances

その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?Narimichi Takamura
 
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!オラクルエンジニア通信
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本Takahiro YAMADA
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術yoku0825
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るオラクルエンジニア通信
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド崇介 藤井
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説Masahiko Sawada
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化Takuya ASADA
 
インストールしてみたWindows Server 2019 on VirtualBox
インストールしてみたWindows Server 2019 on VirtualBoxインストールしてみたWindows Server 2019 on VirtualBox
インストールしてみたWindows Server 2019 on VirtualBoxShin Tanigawa
 
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コースJuniper Networks (日本)
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0オラクルエンジニア通信
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーションNTT Software Innovation Center
 
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメSatoshi Takami
 

Tendances (20)

その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?その ionice、ほんとに効いてますか?
その ionice、ほんとに効いてますか?
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 
OCI GoldenGate Overview 2021年4月版
OCI GoldenGate Overview 2021年4月版OCI GoldenGate Overview 2021年4月版
OCI GoldenGate Overview 2021年4月版
 
Oracle GoldenGate FAQ
Oracle GoldenGate FAQOracle GoldenGate FAQ
Oracle GoldenGate FAQ
 
インストールしてみたWindows Server 2019 on VirtualBox
インストールしてみたWindows Server 2019 on VirtualBoxインストールしてみたWindows Server 2019 on VirtualBox
インストールしてみたWindows Server 2019 on VirtualBox
 
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース
【SRX】JUNOS ハンズオントレーニング資料 SRXシリーズ サービス ゲートウェイ コース
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
 
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
 

Plus de yy yank

Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門yy yank
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMyy yank
 
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係yy yank
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪yy yank
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzzyy yank
 
KuromojiをKotlinで動かす
KuromojiをKotlinで動かすKuromojiをKotlinで動かす
KuromojiをKotlinで動かすyy yank
 
絶対にぬるぽを出さない
絶対にぬるぽを出さない絶対にぬるぽを出さない
絶対にぬるぽを出さないyy yank
 
Kotlinこんなん出ましたけど
Kotlinこんなん出ましたけどKotlinこんなん出ましたけど
Kotlinこんなん出ましたけどyy yank
 
Kotlinあるある言いたい
Kotlinあるある言いたいKotlinあるある言いたい
Kotlinあるある言いたいyy yank
 
【こっそり始める】Javaプログラマコーディングマイグレーション
【こっそり始める】Javaプログラマコーディングマイグレーション【こっそり始める】Javaプログラマコーディングマイグレーション
【こっそり始める】Javaプログラマコーディングマイグレーションyy yank
 
Kotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にKotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にyy yank
 
Server Side Kotlin
Server Side KotlinServer Side Kotlin
Server Side Kotlinyy yank
 

Plus de yy yank (12)

Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
 
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzz
 
KuromojiをKotlinで動かす
KuromojiをKotlinで動かすKuromojiをKotlinで動かす
KuromojiをKotlinで動かす
 
絶対にぬるぽを出さない
絶対にぬるぽを出さない絶対にぬるぽを出さない
絶対にぬるぽを出さない
 
Kotlinこんなん出ましたけど
Kotlinこんなん出ましたけどKotlinこんなん出ましたけど
Kotlinこんなん出ましたけど
 
Kotlinあるある言いたい
Kotlinあるある言いたいKotlinあるある言いたい
Kotlinあるある言いたい
 
【こっそり始める】Javaプログラマコーディングマイグレーション
【こっそり始める】Javaプログラマコーディングマイグレーション【こっそり始める】Javaプログラマコーディングマイグレーション
【こっそり始める】Javaプログラマコーディングマイグレーション
 
Kotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にKotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前に
 
Server Side Kotlin
Server Side KotlinServer Side Kotlin
Server Side Kotlin
 

Doma2 with Kotlin