Введение в работу с базами данных в Kotlin
Kotlin — современный язык программирования, который активно используется для создания серверных приложений, Android-разработки и бэкенд-сервисов. Одним из ключевых навыков для любого разработчика является умение работать с базами данных. В этой статье мы разберем, как подключаться к реляционной базе данных PostgreSQL и документо-ориентированной MongoDB, используя Kotlin. Материал ориентирован на начинающих: мы рассмотрим установку драйверов, настройку подключения и выполнение базовых CRUD-операций (создание, чтение, обновление, удаление).
1. Подготовка среды и зависимости
Для работы вам понадобится проект на Kotlin (например, с использованием Gradle или Maven). Мы будем использовать Gradle — самый популярный инструмент сборки в экосистеме Kotlin. Добавьте следующие зависимости в файл build.gradle.kts:
dependencies {
// Для PostgreSQL
implementation("org.jetbrains.exposed:exposed-core:0.44.1")
implementation("org.jetbrains.exposed:exposed-dao:0.44.1")
implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1")
implementation("org.postgresql:postgresql:42.7.1")
// Для MongoDB
implementation("org.mongodb:mongodb-driver-kotlin-sync:4.11.1")
implementation("org.mongodb:bson-kotlinx:4.11.1")
}
Exposed — это легковесная ORM-библиотека для Kotlin, которая упрощает работу с SQL-базами. Для MongoDB мы используем официальный Kotlin-драйвер от MongoDB.
2. Работа с PostgreSQL через Exposed
2.1. Подключение к базе данных
Сначала создадим объект для подключения к PostgreSQL. Убедитесь, что на вашем компьютере запущен сервер PostgreSQL и создана база данных (например, testdb).
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.transactions.transaction
fun main() {
// Подключение к локальной БД
Database.connect(
url = "jdbc:postgresql://localhost:5432/testdb",
driver = "org.postgresql.Driver",
user = "postgres",
password = "your_password"
)
println("Подключение к PostgreSQL успешно установлено")
}
После подключения можно выполнять SQL-запросы. Exposed использует DSL (Domain-Specific Language) для написания запросов на Kotlin.
2.2. Создание таблицы и CRUD-операции
Определим простую таблицу Users с полями id, name и email:
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
object Users : Table() {
val id = integer("id").autoIncrement()
val name = varchar("name", 50)
val email = varchar("email", 100)
override val primaryKey = PrimaryKey(id)
}
fun main() {
Database.connect(...)
transaction {
// Создание таблицы
SchemaUtils.create(Users)
// INSERT (создание)
Users.insert {
it[name] = "Иван Петров"
it[email] = "ivan@example.com"
}
// SELECT (чтение)
val users = Users.selectAll().map {
"${it[Users.id]}: ${it[Users.name]} (${it[Users.email]})"
}
println("Пользователи: $users")
// UPDATE (обновление)
Users.update({ Users.id eq 1 }) {
it[name] = "Иван Сидоров"
}
// DELETE (удаление)
Users.deleteWhere { Users.id eq 1 }
}
}
Как видите, код очень похож на обычный SQL, но написан на чистом Kotlin. Exposed автоматически экранирует имена и защищает от SQL-инъекций.
3. Работа с MongoDB через Kotlin Driver
3.1. Подключение к MongoDB
MongoDB — NoSQL база данных, хранящая данные в виде JSON-подобных документов. Для подключения используем синхронный драйвер:
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val client = MongoClient.create("mongodb://localhost:27017")
val database = client.getDatabase("testdb")
val collection = database.getCollection<User>("users")
println("Подключение к MongoDB успешно установлено")
client.close()
}
data class User(
val id: String? = null,
val name: String,
val email: String
)
Обратите внимание: мы используем корутины (runBlocking), так как драйвер поддерживает асинхронные операции. Для простоты примера используем синхронный вызов.
3.2. CRUD-операции в MongoDB
Теперь выполним базовые операции с коллекцией users:
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
import org.bson.types.ObjectId
fun main() = runBlocking {
val client = MongoClient.create("mongodb://localhost:27017")
val collection = client.getDatabase("testdb").getCollection<User>("users")
// CREATE (вставка документа)
val newUser = User(name = "Анна Смирнова", email = "anna@example.com")
val insertResult = collection.insertOne(newUser)
println("Вставлен документ с id: ${insertResult.insertedId}")
// READ (чтение всех документов)
val users = collection.find().toList()
users.forEach { println("${it.id}: ${it.name} (${it.email})") }
// UPDATE (обновление по имени)
collection.updateOne(
filter = org.bson.Document("name", "Анна Смирнова"),
update = org.bson.Document("\$set", org.bson.Document("email", "anna_new@example.com"))
)
// DELETE (удаление по id)
collection.deleteOne(org.bson.Document("_id", ObjectId("...")))
client.close()
}
MongoDB использует BSON-документы для фильтрации и обновления. Вы можете работать как с сырыми Document, так и с data-классами Kotlin (как в примере с User).
4. Сравнение PostgreSQL и MongoDB
Какую базу данных выбрать? Приведем краткое сравнение:
- PostgreSQL — реляционная БД с строгой схемой. Подходит для финансовых систем, ERP, где важны транзакции и целостность данных. Используйте Exposed или Hibernate.
- MongoDB — документо-ориентированная БД. Идеальна для прототипов, IoT, логов и приложений с меняющейся