[Day 14] 怎麼用 exposed DAO 存取資料庫

安裝好 exposed 框架之後,我們就可以試看看存取資料庫了

首先我們用 DAO 的方式來存取資料庫

什麼是 DAO

DAO,全名是 Data Access Object,顧名思義就是用物件的形式來存取。

因為這樣的方式比較符合以物件思考資料的架構,所以也會是後面教學所使用的主要方式。

DAO

首先,我們先宣告對應資料庫的物件 Cities 和類別 City

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
}

這張表很單純,只有一個叫做 name 的欄位。

建立資料表的部分,我們可以透過

SchemaUtils.create (Cities)

進行資料表的建立。

這樣,我們就可以在程式裡使用 CITIES 資料表了。我們來試看看簡單的存取。

City.new {
    name = "St. Petersburg"
}

可以建立一筆新的 CITIES 資料,其中 nameSt. Petersburg

要取出這筆資料,我們可以用 findById() 取出。

組合起來,就變成這樣:

get("/") {
    val cityName = transaction {
        // print sql to std-out
        addLogger(StdOutSqlLogger)
        SchemaUtils.create (Cities)
        City.new {
            name = "St. Petersburg"
        }
        City.findById(1)?.name
    }
    call.respondText("Cities: $cityName", contentType = ContentType.Text.Plain)
}

我們連線 http://127.0.0.1:8080/ 就可以看到 Cities: St. Petersburg,代表我們寫入資料庫成功了!

另外,我們也可以在 cmd 裡面看到 SQL 語法:

SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, "NAME" VARCHAR(50) NOT NULL)
SQL: INSERT INTO CITIES ("NAME") VALUES ('St. Petersburg')
SQL: SELECT CITIES.ID, CITIES."NAME" FROM CITIES WHERE CITIES.ID = 1

今天有關 exposed DAO 的部分就講到這裡,我們明天見!