0Pricing
Kotlin Academy · درس

عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete

نفّذ جميع عمليات CRUD باستخدام Query DSL الآمن للأنواع في Exposed.

عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

نظرة عامة على Query DSL

يتيح لك Query DSL في Exposed كتابة عمليات SQL آمنة الأنواع باستخدام دوال Kotlin. تُنفَّذ جميع العمليات داخل كتلة transaction { }. ولا توجد سلاسل نصية سحرية — إذ تكون مراجع الأعمدة خصائص Kotlin، ولذلك تُكتشف الأخطاء المطبعية أثناء التجميع.

الإدراج

استخدم Table.insert { } لإضافة صف. وتستقبل دالة lambda كائن 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 هذه العمليات داخل عبارة prepared statement واحدة:

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 }) { } لتعديل الصفوف الموجودة. وتستقبل دالة lambda الداخلية كائن 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 باستخدام Query DSL

النقاط الأساسية:

  • insert { } — إضافة صف؛ insertAndGetId { } — إضافة صف والحصول على المفتاح الأساسي
  • selectAll().where { } — إجراء استعلام باستخدام مرشح؛ مع إمكانية تسلسل .orderBy() و.limit()
  • update({ condition }) { } — تعديل الصفوف؛ deleteWhere { } — إزالة الصفوف
  • تُنفَّذ جميع العمليات داخل transaction { }
  • مراجع الأعمدة آمنة أثناء الترجمة — ولا حاجة إلى أسماء أعمدة نصية

الأسئلة الشائعة

هل درس «عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete» مجاني؟

نعم — نص درس «عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete»؟

نفّذ جميع عمليات CRUD باستخدام Query DSL الآمن للأنواع في Exposed. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد Exposed: اتصال قاعدة البيانات وDSL للمعاملات
  2. تعريف الجداول باستخدام Table DSL
  3. عمليات CRUD باستخدام Query DSL: ‏insert وselect وupdate وdelete
  4. Exposed DAO: أصناف Entity والعلاقات
← العودة إلى Kotlin Academy