Exposed - DSL

  • Table

    In Exposed, the Table class is the core abstraction for defining database tables. This class provides methods to define various column types, constraints, and other table-specific properties.

    Table is located in the org.jetbrains.exposed.v1.core package of the exposed-core module.

    The following example defines a table with an auto-incrementing integer id column and string name and email column:

    object Customer : Table("customers") {
    val id = integer("id").autoIncrement()
    val name = text("name")
    val email = text("email").uniqueIndex()
    }

    Insert

    Exposed provides several functions to insert rows into a table:

    Insert a single row

    To create a new table row, use the .insert() function:

    suspendTransaction(database) {
    Customer.insert {
    it[name] = "Mary"
    it[email] = "mary@xtec.dev"
    }
    }

    The .insert() function returns a InsertStatement object that contains the inserted row’s primary key value.

    val id = Customer.insert {
    it[name] = "Susan"
    it[email] = "susan@xtec.dev"
    } get Customer.id // or }.get(Customer.id)

    If the same row already exists in the table, it throws an exception.

    Batch insert

    .batchInsert() allows mapping a list of entities into table rows in a single SQL statement.

    It is more efficient than using the insert query for each row as it initiates only one statement.

    suspendTransaction {
    val customers = listOf(
    Pair("John", "john@xtec.dev"),
    Pair("Anne", "anne@xtec.dev")
    )
    Customer.batchInsert(customers) { (name, email) ->
    this[Customer.name] = name
    this[Customer.email] = email
    }
    }

    Read

    Retrieve all records

    To retrieve all records from a table, use the .selectAll() method:

    Query inherits Iterable so it is possible to traverse it using .map() or .forEach():

    suspendTransaction {
    val customers = listOf(
    Pair("John", "john@xtec.dev"),
    Pair("Anne", "anne@xtec.dev"),
    Pair("Mike", "mike@xtec.dev")
    )
    Customer.batchInsert(customers) { (name, email) ->
    this[Customer.name] = name
    this[Customer.email] = email
    }
    }
    suspendTransaction(database) {
    val result = Customer.selectAll().map { it[Customer.name] }.toList()
    result shouldBe listOf("John", "Anne", "Mike")
    }

    Retrieve a record

    The .select() function allows you to select specific columns or/and expressions.

    suspendTransaction {
    val result = Customer.select(Customer.email).toList()
    result.map { it[Customer.email] } shouldBe listOf("john@xtec.dev", "anne@xtec.dev", "mike@xtec.dev")
    }

    Query

    Pending