العمل مع قواعد البيانات في Kotlin: PostgreSQL و MongoDB

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا Kotlin للعمل مع قواعد البيانات؟

Kotlin هي لغة حديثة ذات أنواع ثابتة، متوافقة تمامًا مع Java وتُستخدم بنشاط لإنشاء تطبيقات الواجهة الخلفية. بفضل تركيبها المختصر، وأمانها من القيم الفارغة (null-safety)، وأدواتها القوية، تُعد Kotlin مثالية للعمل مع قواعد البيانات العلائقية (PostgreSQL) والموجهة للوثائق (MongoDB). في هذه المقالة، سنستعرض أمثلة عملية للاتصال، وتنفيذ عمليات CRUD، وتحسين الاستعلامات.

سننظر في مكتبتين شائعتين: Exposed (لـ PostgreSQL) و KMongo (لـ MongoDB). ستتعلم كيفية إعداد البيئة، وكتابة استعلامات فعالة، وتجنب الأخطاء الشائعة.

1. العمل مع PostgreSQL عبر Exposed

Exposed هي مكتبة ORM للغة Kotlin توفر واجهتين برمجيتين: DSL (لغة خاصة بالمجال) لكتابة الاستعلامات بأسلوب SQL و DAO (كائن الوصول إلى البيانات) للنهج الكائني. سنستعرض كلا الخيارين.

1.1. الاتصال والإعداد

أضف التبعيات في ملف build.gradle.kts:

dependencies {
    implementation("org.jetbrains.exposed:exposed-core:0.41.1")
    implementation("org.jetbrains.exposed:exposed-dao:0.41.1")
    implementation("org.jetbrains.exposed:exposed-jdbc:0.41.1")
    implementation("org.postgresql:postgresql:42.5.0")
}

الاتصال بقاعدة البيانات:

import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.transactions.transaction

fun main() {
    Database.connect(
        url = "jdbc:postgresql://localhost:5432/mydb",
        driver = "org.postgresql.Driver",
        user = "user",
        password = "password"
    )
    println("تم الاتصال بـ PostgreSQL")
}

1.2. إنشاء الجدول وعمليات CRUD (DSL)

لنعرف الجدول Users:

import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.update

object Users : Table() {
    val id = integer("id").autoIncrement()
    val name = varchar("name", 50)
    val email = varchar("email", 100).uniqueIndex()
    override val primaryKey = PrimaryKey(id)
}

لننفذ عمليات CRUD:

transaction {
    // إنشاء الجدول
    SchemaUtils.create(Users)

    // INSERT
    Users.insert {
        it[name] = "أليكسي"
        it[email] = "alex@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 (نستخدم deleteWhere)
    Users.deleteWhere { Users.id eq 2 }
}

1.3. نهج DAO

لننشئ كيانًا وفئة DAO:

import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.IntIdTable

object UsersDAO : IntIdTable() {
    val name = varchar("name", 50)
    val email = varchar("email", 100)
}

class User(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<User>(UsersDAO)
    var name by UsersDAO.name
    var email by UsersDAO.email
}

// الاستخدام
transaction {
    val newUser = User.new {
        name = "ماريا"
        email = "maria@example.com"
    }
    println("تم إنشاء مستخدم بالمعرف: ${newUser.id.value}")
}

2. العمل مع MongoDB عبر KMongo

KMongo هو مشغل (driver) موجه نحو coroutines لـ MongoDB، مبني على أساس مشغل Java الرسمي. وهو يدعم التسلسل (serialization) عبر kotlinx.serialization و Jackson.

2.1. الاتصال بـ KMongo

أضف إلى ملف build.gradle.kts:

المدونات

توصيات الكتب