Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin nativeなDBライブラリ Exposedを採用した話 / A story of adopting Exposed - a DB library written by Kotlin

Kotlin nativeなDBライブラリ Exposedを採用した話 / A story of adopting Exposed - a DB library written by Kotlin

Yuya Urano

June 06, 2019
Tweet

Other Decks in Programming

Transcript

  1. 3 浦野 裕也 (うらの ゆうや)
 @yu_rano
 
 所属 | 日本経済新聞社

    日経IDチーム 
 
 
 
日経IDのリニューアルプロジェクトでサーバーサイ ドの言語にKotlinを採用。
 今日はサーバーサイドの話をします。

  2. 各種ライブラリ 採用候補
 6 Application framework
 • Spring
 • Ktor
 Test


    • JUnit
 • Spek
 Database access
 • Spring JPA (Hibernate) 
 • MyBatis
 • DOMA2
 • Exposed

  3. 各種ライブラリ 採用候補
 8 Application framework
 • Spring (採用)
 • Ktor


    Test
 • JUnit (採用)
 • Spek
 Database access
 • Spring JPA (Hibernate) 
 • MyBatis
 • DOMA2
 • Exposed

  4. 各種ライブラリ 採用候補
 10 Application framework
 • Spring (採用)
 • Ktor


    Test
 • JUnit (採用)
 • Spek
 Database access
 • Spring JPA (Hibernate) 
 • MyBatis
 • DOMA2
 • Exposed
 どれも決め手に欠ける... 

  5. なぜExposedを採用したか
 • 軽量なライブラリ
 • 異なるパラダイムの2つのAPI
 ◦ DSL API: SQLライクにかけるKotlin DSLのAPI


    ◦ DAO API: O/R mapper
 • 設定とデータアクセス処理がKotlinで完結する
 • ロードマップにコルーチンサポート・R2DBC/ADBAへの移行が載っていた
 ◦ 将来的にnon-blocking I/O モデルへの移行も視野に入れられそう
 ◦ https://github.com/JetBrains/Exposed/blob/master/ROADMAP.md
 • JetBrains製
 11
  6. テーブル定義
 14 object StarWarsFilms : Table() { val id =

    integer("id").autoIncrement().primaryKey() val sequelId = integer("sequel_id").uniqueIndex() val name = varchar("name", 50) val director = varchar("director", 50) } 出典 | https://github.com/JetBrains/Exposed/wiki/DSL 
 Tableクラスを継承したobjectを定義する 
 • テーブル名はTable(name=”table_name”)で指定 
 • 指定しない場合、クラス名から”Table”サフィックスを取ったものになる 
 • 列名や型、PKなどの制約をメソッドチェーンで指定する 

  7. DSL APIの例
 fun main(args: Array<String>) { //an example connection to

    H2 DB Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { // insert new city. SQL: INSERT INTO Cities (name) VALUES ('St. Petersburg') val stPeteId = Cities.insert { it[name] = "St. Petersburg" } get Cities.id // 'select *' SQL: SELECT Cities.id, Cities.name FROM Cities println("Cities: ${Cities.selectAll()}") } } object Cities: IntIdTable() { val name = varchar("name", 50) } 
 15 出典 | https://github.com/JetBrains/Exposed/wiki/Getting-Started

  8. DAO APIの例
 fun main(args: Array<String>) { //an example connection to

    H2 DB Database.connect("jdbc:h2:mem:test" , driver = "org.h2.Driver" ) transaction { // insert new city. SQL: INSERT INTO Cities (name) VALUES ('St. Petersburg') val stPete = City.new { name = "St. Petersburg" } // 'select *' SQL: SELECT Cities.id, Cities.name FROM Cities println("Cities: ${City.all()}") } } object Cities: IntIdTable() { val name = varchar("name", 50) } class City(id: EntityID<Int>) : IntEntity(id) { companion object : IntEntityClass <City>(Cities) var name by Cities.name } 
 16 出典 | https://github.com/JetBrains/Exposed/wiki/Getting-Started