ORM für Kotlin: Vergleich und Beispiele
Bei der Entwicklung von Anwendungen in Kotlin ist die Arbeit mit Datenbanken eine der zentralen Aufgaben. Anstatt rohe SQL-Abfragen zu schreiben, verwenden Entwickler zunehmend ORM (Object-Relational Mapping) – Werkzeuge, die die Umwandlung von Daten zwischen dem Objektmodell und relationalen Tabellen automatisieren. In diesem Artikel betrachten wir drei beliebte ORMs für Kotlin: Exposed, Room und Ktorm. Wir vergleichen ihre Architektur, Leistung, Benutzerfreundlichkeit und geben praktische Codebeispiele.
1. Exposed – Leichte DSL-Bibliothek von JetBrains
Exposed ist eine Bibliothek, die von den Entwicklern von Kotlin erstellt wurde. Sie ist kein vollwertiges ORM im klassischen Sinne (wie Hibernate), sondern bietet zwei Ansätze: DSL (Domain Specific Language) zum Schreiben von Abfragen im Kotlin-Stil und DAO (Data Access Objects) für die Arbeit mit Objekten. Exposed arbeitet auf Basis von JDBC und unterstützt PostgreSQL, MySQL, H2, SQLite und andere.
Codebeispiel mit Exposed (DSL)
// Verbindung zur DatenbankDatabase.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
// Tabellendefinitionobject Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 50) val age = integer("age") override val primaryKey = PrimaryKey(id)}
// Einfügen und Abfragentransaction { SchemaUtils.create(Users) Users.insert { it[name] = "Alice" it[age] = 30 } Users.selectAll().forEach { println("${it[Users.name]}: ${it[Users.age]}") }}Vor- und Nachteile von Exposed
- Vorteile: geringes Gewicht, vollständige Kontrolle über SQL, gute Integration mit Kotlin Coroutines, aktive Community.
- Nachteile: keine automatische Schema-Generierung (muss manuell erstellt werden), keine integrierte Migrationsunterstützung (erfordert Flyway oder Liquibase).
2. Room – Offizielles ORM für Android von Google
Room ist eine Bibliothek, die Teil von Android Jetpack ist. Sie bietet eine Abstraktionsebene über SQLite und generiert automatisch Code für den Datenzugriff. Room verwendet Annotationen und Kompilierung zur Build-Zeit (KAPT oder KSP), was hohe Leistung und Typsicherheit gewährleistet.
Codebeispiel mit Room
// Entität@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)}
// Datenbank@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}Vor- und Nachteile von Room
- Vorteile: vollständige Integration mit Android, Unterstützung von Flow und LiveData, automatische Codegenerierung, integrierte Migrationen.
- Nachteile: an die Android-Plattform gebunden (nicht geeignet für Server- oder Desktop-Anwendungen), schwerer im Vergleich zu Exposed.
3. Ktorm – Funktionelles ORM für Kotlin
Ktorm ist eine moderne ORM-Bibliothek, die einen funktionalen Stil für die Arbeit mit Datenbanken bietet. Sie verwendet keine Annotationen und Reflexion, sondern setzt auf Kotlin DSL und Erweiterungen. Ktorm unterstützt viele DBMS (MySQL, PostgreSQL, Oracle, SQLite u.a.) und kann sowohl mit JDBC als auch mit SQL-Dialekten arbeiten.
Codebeispiel mit Ktorm
// Verbindung und Tabellendefinitionval database = Database.connect("jdbc:mysql://localhost/mydb", user = "root", password = "pass")
object Users : Table<Nothing>("users") { val id = int("id").primaryKey() val name = varch Auch in der Bibliothek
PHP-Aufgabenplaner: Cron-ähnlicher Warteschlangenmanager in PHP
Supertest für JavaScript (Node.js): Komplettguide mit Beispielen
GraphQL-Bibliotheken für TypeScript: Vollständiger Leitfaden zur Auswahl und Verwendung