ORM لـ Kotlin: مقارنة وأمثلة
عند تطوير التطبيقات بلغة Kotlin، يعد العمل مع قواعد البيانات من المهام الأساسية. بدلاً من كتابة استعلامات SQL الخام، يستخدم المطورون بشكل متزايد ORM (تعيين الكائنات العلائقية) - وهي أدوات تعمل على أتمتة تحويل البيانات بين النموذج الكائني والجداول العلائقية. في هذه المقالة، سنستعرض ثلاثة ORMs شائعة لـ Kotlin: Exposed و Room و Ktorm. سنقارن بين بنيتها وأدائها وسهولة استخدامها ونقدم أمثلة عملية للكود.
1. Exposed - مكتبة DSL خفيفة من JetBrains
Exposed هي مكتبة طورها مبتكرو Kotlin. إنها ليست ORM كاملة بالمعنى التقليدي (مثل Hibernate)، بل تقدم نهجين: DSL (لغة خاصة بالمجال) لكتابة الاستعلامات بأسلوب Kotlin و DAO (كائنات الوصول إلى البيانات) للعمل مع الكائنات. تعمل Exposed فوق JDBC وتدعم PostgreSQL و MySQL و H2 و SQLite وغيرها.
مثال كود مع Exposed (DSL)
// الاتصال بقاعدة البياناتDatabase.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
// تعريف الجدولobject Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 50) val age = integer("age") override val primaryKey = PrimaryKey(id)}
// الإدراج والاستعلامtransaction { SchemaUtils.create(Users) Users.insert { it[name] = "Alice" it[age] = 30 } Users.selectAll().forEach { println("${it[Users.name]}: ${it[Users.age]}") }}إيجابيات وسلبيات Exposed
- الإيجابيات: وزن خفيف، تحكم كامل في SQL، تكامل جيد مع Kotlin Coroutines، مجتمع نشط.
- السلبيات: عدم وجود توليد تلقائي للمخطط (يحتاج إلى إنشاء يدوي)، عدم وجود دعم مدمج للترحيل (يتطلب Flyway أو Liquibase).
2. Room - ORM الرسمي لنظام Android من Google
Room هي مكتبة جزء من Android Jetpack. توفر طبقة تجريد فوق SQLite وتقوم بتوليد الكود تلقائياً للوصول إلى البيانات. تستخدم Room التعليقات التوضيحية والتجميع في مرحلة البناء (KAPT أو KSP)، مما يضمن أداء عالياً وأماناً في الأنواع.
مثال كود مع Room
// الكيان@Entity(tableName = "users")data class User( @PrimaryKey(autoGenerate = true) val id: Int = 0, val name: String, val age: Int)
// DAO@Daointerface UserDao { @Query("SELECT * FROM users") suspend fun getAll(): List<User>
@Insert suspend fun insert(user: User)}
// قاعدة البيانات@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}إيجابيات وسلبيات Room
- الإيجابيات: تكامل كامل مع Android، دعم Flow و LiveData، توليد تلقائي للكود، ترحيل مدمج.
- السلبيات: مرتبط بمنصة Android (غير مناسب للتطبيقات الخادمية أو سطح المكتب)، أثقل مقارنة بـ Exposed.
3. Ktorm - ORM وظيفي لـ Kotlin
Ktorm هي مكتبة ORM حديثة تقدم أسلوباً وظيفياً للعمل مع قواعد البيانات. لا تستخدم التعليقات التوضيحية والانعكاس، بل تعتمد على Kotlin DSL والإضافات. تدعم Ktorm العديد من أنظمة إدارة قواعد البيانات (MySQL، PostgreSQL، Oracle، SQLite وغيرها) ويمكنها العمل مع JDBC ولهجات SQL.
مثال كود مع Ktorm
// الاتصال وتعريف الجدولval database = Database.connect("jdbc:mysql://localhost/mydb", user = "root", password = "pass")
object Users : Table<Nothing>("users") { val id = int("id").primaryKey() val name = varch