مقدمة في العمل مع قواعد البيانات في Kotlin
\n\nKotlin هي لغة حديثة ثابتة الأنواع تعمل على JVM، وتكتسب شعبية سريعة بفضل إيجازها وأمانها. من المهارات الأساسية لأي مطور هي القدرة على التفاعل مع قواعد البيانات. في هذه المقالة، سنستعرض كيفية الاتصال وتنفيذ العمليات الأساسية (CRUD) مع أشهر نوعين من قواعد البيانات: PostgreSQL العلائقية و MongoDB الموجهة للمستندات.
\n\nسنستخدم مكتبات حديثة، مكيفة بشكل كبير مع Kotlin الاصطلاحي:
\n- \n
- Exposed — إطار عمل ORM من JetBrains لقواعد بيانات SQL (PostgreSQL, MySQL وغيرها). \n
- KMongo — عميل ODM تفاعلي لـ MongoDB، مبني على coroutines. \n
المقالة موجهة للمبتدئين: سنشرح إعداد المشروع، الاتصال بقاعدة البيانات وأمثلة بسيطة لإدراج وقراءة وتحديث وحذف البيانات.
\n\n1. إعداد المشروع وإضافة التبعيات
\n\nللبدء، قم بإنشاء مشروع Kotlin جديد (على سبيل المثال، عبر IntelliJ IDEA مع Gradle أو Maven). أضف التبعيات اللازمة في ملف build.gradle.kts.
تبعيات Gradle لـ PostgreSQL (Exposed)
\ndependencies {\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.44.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.44.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1")\n\n // برنامج تشغيل PostgreSQL\n implementation("org.postgresql:postgresql:42.7.1")\n\n // تجمع الاتصالات (HikariCP)\n implementation("com.zaxxer:HikariCP:5.1.0")\n}\n\nتبعيات Gradle لـ MongoDB (KMongo)
\ndependencies {\n // KMongo (مع coroutines)\n implementation("org.litote.kmongo:kmongo-coroutine:4.11.0")\n\n // عميل Ktor (إذا كان برنامج التشغيل التفاعلي مطلوبًا)\n implementation("org.litote.kmongo:kmongo-async:4.11.0")\n}\n\nبعد مزامنة المشروع، يمكنك البدء في الاتصال.
\n\n2. العمل مع PostgreSQL عبر Exposed
\n\nيوفر Exposed طريقتين: DSL (استعلامات SQL آمنة من حيث النوع) و DAO (تعيين كائن-علائقي). سنستخدم DAO - فهو أكثر بديهية للمبتدئين.
\n\nالاتصال بقاعدة البيانات
\nimport org.jetbrains.exposed.sql.Database\nimport org.jetbrains.exposed.sql.transactions.transaction\nimport com.zaxxer.hikari.HikariConfig\nimport com.zaxxer.hikari.HikariDataSource\n\nfun connectToPostgres() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://localhost:5432/mydb"\n driverClassName = "org.postgresql.Driver"\n username = "user"\n password = "password"\n maximumPoolSize = 10\n }\n val dataSource = HikariDataSource(config)\n Database.connect(dataSource)\n println("تم الاتصال بـ PostgreSQL!")\n}\n\nتعريف الجدول والكيان
\nimport org.jetbrains.exposed.dao.id.IntIdTable\nimport org.jetbrains.exposed.dao.IntEntity\nimport org.jetbrains.exposed.dao.IntEntityClass\n\n// تعريف الجدول\nobject UsersTable : IntIdTable("users") {\n val name = varchar("name", 100)\n val email = varchar("email", 255).uniqueIndex()\n val age = integer("age").default(18)\n}\n\n// تعريف الكيان (DAO)\nclass UserEntity(id: EntityID<Int>) : IntEntity(id) {\n companion object : IntEntityClass<UserEntity>(UsersTable)\n\n var name by UsersTable.name\n var email by UsersTable.email\n var age by UsersTable.age\n}\n\nعمليات CRUD
\nfun performCRUD() {\n transaction {\n // إنشاء الجدول (إذا لم يكن موجودًا)\n SchemaUtils.create(UsersTable)\n\n // INSERT\n val newUser = UserEntity.new {\n name = "إيفان بيتروف"\n email = "ivan@example.com"\n age = 25\n }\n println("تم إنشاء المستخدم")