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 { }— добавить строку и получить PKselectAll().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 — локальная установка не требуется.
Все уроки этого курса
- Настройка Exposed: подключение к базе данных и DSL транзакций
- Определение таблиц с DSL Table
- CRUD с DSL запросов: insert, select, update, delete
- DAO Exposed: классы сущностей и связи