Deep Dive into DSL | Exposed

DSL(Domian-Specific Language) API

실제 SQL 문과 유사하지만 Kotlin이 제공하는 type-safe를 갖고 있다.

일반적으로 org.jetbrains.exposed.sql.Table 을 상속해서 테이블을 작성한다.

object StarWarsFilms : Table() {
    val id: Column<Int> = integer("id").autoIncrement()
    val sequelId: Column<Int> = integer("sequel_id").uniqueIndex()
    val name: Column<String> = varchar("name", 50)
    val director: Column<String> = varchar("director", 50)
    override val primaryKey = PrimaryKey(id, name = "PK_StarWarsFilms_Id") // PK_StarWarsFilms_Id is optional here
}

Tables that contains Int id with the name id

object StarWarsFilms : IntIdTable() {
    val sequelId: Column<Int> = integer("sequel_id").uniqueIndex()
    val name: Column<String> = varchar("name", 50)
    val director: Column<String> = varchar("director", 50)
}

CRUD operations

Create

insert 쿼리로 작성한다. query를 사용해서 코드를 작성한다는 점이 Kotlin DSL의 특징인 것 같다.

// SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
// VALUES ('RUSSIA', 'St. Petersburg', 300)
Cities.insert {
    it[name] = "St. Petersburg"
    it[country] = Country.RUSSIA
    it[population] = 500
}
// SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
// VALUES ('RUSSIA', 'St. Petersburg', 300)
**val id = Cities.insertAndGetId** {
    it[name] = "St. Petersburg"
    it[country] = Country.RUSSIA
    it[population] = 500
}