0Pricing
Kotlin Academy · Урок

CRUD с DSL запросов: insert, select, update, delete

Выполняйте все операции CRUD с помощью типобезопасного DSL запросов Exposed.

«CRUD с DSL запросов: insert, select, update, delete» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Обзор DSL запросов

DSL запросов Exposed позволяет записывать типобезопасные операции SQL с помощью функций Kotlin. Все операции выполняются внутри блока transaction { }. Магические строки не используются: ссылки на столбцы являются свойствами Kotlin, поэтому опечатки обнаруживаются во время компиляции.

Вставка

Используйте Table.insert { }, чтобы добавить строку. Лямбда получает InsertStatement, а значения столбцов задаются с помощью оператора [column]:

transaction {
    Users.insert {
        it[Users.name]  = "Alice"
        it[Users.email] = "alice@example.com"
        it[Users.age]   = 30
    }
}

Вставка и получение сгенерированного идентификатора

Используйте insertAndGetId { } у IdTable, чтобы получить автоматически сгенерированный первичный ключ после вставки:

val newId: Long = transaction {
    Users.insertAndGetId {
        it[Users.name]  = "Bob"
        it[Users.email] = "bob@example.com"
    }.value
}

Пакетная вставка

Используйте batchInsert(list) { item -> ... } для эффективной вставки нескольких строк. Exposed объединяет их в один подготовленный оператор:

val newUsers = listOf("Carol" to "carol@e.com", "Dave" to "dave@e.com")
transaction {
    Users.batchInsert(newUsers) { (name, email) ->
        this[Users.name]  = name
        this[Users.email] = email
    }
}

Выборка всех строк

Используйте Table.selectAll(), чтобы получить все строки. Перебирайте результат как последовательность объектов ResultRow; обращайтесь к значениям столбцов через row[Column]:

transaction {
    Users.selectAll().forEach { row ->
        println("${row[Users.id]}: ${row[Users.name]}")
    }
}

Выборка с условием Where

Объединяйте в цепочку .where { condition } (в Exposed 0.46 и более новых версиях) или .select { condition }, чтобы отфильтровать строки. В условиях используются перегруженные операторы (eq, like, greater и т. д.):

transaction {
    Users.selectAll()
        .where { Users.age greater 25 }
        .forEach { println(it[Users.name]) }
}

Выборка определённых столбцов

Передайте список столбцов в .select(col1, col2), чтобы получить только эти столбцы — это эквивалентно SELECT col1, col2 FROM ...:

transaction {
    Users.select(Users.name, Users.email)
        .where { Users.age lessEq 30 }
        .map { it[Users.name] to it[Users.email] }
        .forEach(::println)
}

Обновление

Используйте Table.update({ condition }) { }, чтобы изменить существующие строки. Внутренняя лямбда получает UpdateStatement; используйте [column], чтобы задать новые значения:

transaction {
    Users.update({ Users.id eq 1L }) {
        it[Users.name] = "Alice Updated"
        it[Users.age]  = 31
    }
}

Удаление

Используйте Table.deleteWhere { condition }, чтобы удалить строки, соответствующие условию. Функция возвращает количество удалённых строк:

transaction {
    val deleted = Users.deleteWhere { Users.id eq 5L }
    println("Deleted $deleted rows")
}

Сортировка и ограничение выборки

Объединяйте в цепочку .orderBy(column to SortOrder.ASC) и .limit(n) (с необязательным параметром offset), чтобы сортировать результаты и разбивать их на страницы:

transaction {
    Users.selectAll()
        .orderBy(Users.name to SortOrder.ASC)
        .limit(10, offset = 20)
        .map { it[Users.name] }
        .forEach(::println)
}

Агрегатные функции и подсчёт

Используйте стандартные агрегатные функции SQL через операторы столбцов Exposed: Users.id.count(), Users.age.avg(), Users.age.max() и т. д.:

transaction {
    val total = Users.selectAll().count()
    println("Total users: $total")
}

Быстрая проверка

Какая функция Exposed возвращает автоматически сгенерированный первичный ключ после вставки строки в IdTable?

Повторение: CRUD с DSL запросов

Основные выводы:

  • insert { } — добавить строку; insertAndGetId { } — добавить строку и получить PK
  • selectAll().where { } — выполнить запрос с фильтром; объединять с помощью цепочки .orderBy(), .limit()
  • update({ condition }) { } — изменить строки; deleteWhere { } — удалить строки
  • Все операции выполняются внутри transaction { }
  • Ссылки на столбцы проверяются на этапе компиляции — строковые имена столбцов не нужны

Часто задаваемые вопросы

Урок «CRUD с DSL запросов: insert, select, update, delete» бесплатный?

Да — полный текст урока «CRUD с DSL запросов: insert, select, update, delete» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «CRUD с DSL запросов: insert, select, update, delete»?

Выполняйте все операции CRUD с помощью типобезопасного DSL запросов Exposed. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «CRUD с DSL запросов: insert, select, update, delete»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка Exposed: подключение к базе данных и DSL транзакций
  2. Определение таблиц с DSL Table
  3. CRUD с DSL запросов: insert, select, update, delete
  4. DAO Exposed: классы сущностей и связи
← Назад к Kotlin Academy