[Day 13] 用 Ktor 連線資料庫!談 Kotlin exposed 框架

處理好環境設定之後,我們要來連線資料庫了

要連線資料庫,我們需要另一個框架:exposed

什麼是 exposed

exposed logo

Exposed 是一個 Kotlin 的 ORM framework,可以協助我們在 Kotlin 裡面串接資料庫。

他可以支援多數開發或正式使用的資料庫,比方說:

  • H2
  • MySQL
  • MariaDB
  • Oracle
  • PostgreSQL
  • SQL Server
  • SQLite

我們下面就來安裝 Exposed 框架,並使用 H2 測試開發看看。

安裝

我們在 gradle.build 裡面加上

    implementation "com.h2database:h2:1.4.199"
    compile 'org.jetbrains.exposed:exposed-core:0.24.1'
    compile 'org.jetbrains.exposed:exposed-dao:0.24.1'
    compile 'org.jetbrains.exposed:exposed-jdbc:0.24.1'
    compile 'org.jetbrains.exposed:exposed-jodatime:0.24.1'

加上之後,IDE 會提示你要更新,點擊更新就可以了。

測試連線

再來,我們來連線測試看看:

val user = environment.config.property("ktor.database.user").getString()
val password = environment.config.property("ktor.database.password").getString()
Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver", user = user, password = password)

routing { ... }

連線設定好了,再來我們要看看怎麼設置連線。

在 exposed 裡面,產生 SQL 語句的函式都要放在 transaction {} 這個函式裡面,不過開發時我們會需要看 SQL 語句的內容,這時我們可以用 addLogger(StdOutSqlLogger) 來將 SQL 語法印出來看看

我們可以在 / 裡面寫:

    val user = environment.config.property("ktor.database.user").getString()
    val password = environment.config.property("ktor.database.password").getString()
    Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver", user = user, password = password)
    routing {
        get("/") {
            transaction {
                // print sql to std-out
                addLogger(StdOutSqlLogger)
            }
            call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain)
        }
    // ...
    }

然後,連線 http://0.0.0.0:8080 我們畫面還是可以看到「HELLO WORLD!」,可是沒有任何 SQL 語法印在 cmd 視窗內。

這是因為我們還沒使用任何產生 SQL 語句的函式。至於有哪些函式,就等到明天吧!