Einführung in die Arbeit mit Datenbanken in Kotlin
\n\nKotlin ist eine moderne, statisch typisierte Sprache, die auf der JVM läuft und aufgrund ihrer Prägnanz und Sicherheit rasant an Beliebtheit gewinnt. Eine der Schlüsselqualifikationen für jeden Entwickler ist die Fähigkeit, mit Datenbanken zu interagieren. In diesem Artikel werden wir untersuchen, wie man eine Verbindung herstellt und grundlegende Operationen (CRUD) mit den beiden beliebtesten Datenbanktypen durchführt: der relationalen PostgreSQL und der dokumentenorientierten MongoDB.
\n\nWir werden moderne Bibliotheken verwenden, die optimal an idiomatisches Kotlin angepasst sind:
\n- \n
- Exposed – ORM-Framework von JetBrains für SQL-Datenbanken (PostgreSQL, MySQL u.a.). \n
- KMongo – reaktiver ODM-Client für MongoDB, basierend auf Koroutinen. \n
Der Artikel richtet sich an Anfänger: Wir werden die Projekteinrichtung, die Verbindung zur Datenbank und einfache Beispiele zum Einfügen, Lesen, Aktualisieren und Löschen von Daten durchgehen.
\n\n1. Projekteinrichtung und Hinzufügen von Abhängigkeiten
\n\nErstellen Sie zunächst ein neues Kotlin-Projekt (z.B. über IntelliJ IDEA mit Gradle oder Maven). Fügen Sie die erforderlichen Abhängigkeiten in die Datei build.gradle.kts ein.
Gradle-Abhängigkeiten für 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-Treiber\n implementation("org.postgresql:postgresql:42.7.1")\n\n // Verbindungspool (HikariCP)\n implementation("com.zaxxer:HikariCP:5.1.0")\n}\n\nGradle-Abhängigkeiten für MongoDB (KMongo)
\ndependencies {\n // KMongo (mit Koroutinen)\n implementation("org.litote.kmongo:kmongo-coroutine:4.11.0")\n\n // Ktor Client (falls reaktiver Treiber benötigt wird)\n implementation("org.litote.kmongo:kmongo-async:4.11.0")\n}\n\nNach der Synchronisierung des Projekts kann mit der Verbindung begonnen werden.
\n\n2. Arbeiten mit PostgreSQL über Exposed
\n\nExposed bietet zwei Ansätze: DSL (typsichere SQL-Abfragen) und DAO (objektrelationale Abbildung). Wir werden DAO betrachten – es ist für Anfänger intuitiver.
\n\nVerbindung zur Datenbank
\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("Verbindung zu PostgreSQL hergestellt!")\n}\n\nDefinition der Tabelle und Entität
\nimport org.jetbrains.exposed.dao.id.IntIdTable\nimport org.jetbrains.exposed.dao.IntEntity\nimport org.jetbrains.exposed.dao.IntEntityClass\n\n// Tabelle definieren\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// Entity definieren (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\nCRUD-Operationen
\nfun performCRUD() {\n transaction {\n // Tabelle erstellen (falls nicht vorhanden)\n SchemaUtils.create(UsersTable)\n\n // INSERT\n val newUser = UserEntity.new {\n name = "Ivan Petrov"\n email = "ivan@example.com"\n age = 25\n }\n println("Benutzer erstellt: $newUser")