Работа с базами данных в Kotlin: PostgreSQL и MongoDB для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с базами данных в 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, логов и приложений с меняющейся

Блоги

Рекомендаций по книгам