ORM pour Kotlin : comparaison et exemples
Lors du développement d'applications en Kotlin, le travail avec les bases de données est l'une des tâches clés. Au lieu d'écrire des requêtes SQL brutes, les développeurs utilisent de plus en plus les ORM (Object-Relational Mapping) — des outils qui automatisent la transformation des données entre le modèle objet et les tables relationnelles. Dans cet article, nous examinerons trois ORM populaires pour Kotlin : Exposed, Room et Ktorm. Nous comparerons leur architecture, leurs performances, leur facilité d'utilisation et fournirons des exemples pratiques de code.
1. Exposed — une bibliothèque DSL légère de JetBrains
Exposed est une bibliothèque développée par les créateurs de Kotlin. Ce n'est pas un ORM complet au sens classique (comme Hibernate), mais il propose deux approches : DSL (Domain Specific Language) pour écrire des requêtes dans le style Kotlin et DAO (Data Access Objects) pour travailler avec des objets. Exposed fonctionne au-dessus de JDBC et prend en charge PostgreSQL, MySQL, H2, SQLite et autres.
Exemple de code avec Exposed (DSL)
// Connexion à la base de donnéesDatabase.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
// Définition de la tableobject Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 50) val age = integer("age") override val primaryKey = PrimaryKey(id)}
// Insertion et sélectiontransaction { SchemaUtils.create(Users) Users.insert { it[name] = "Alice" it[age] = 30 } Users.selectAll().forEach { println("${it[Users.name]}: ${it[Users.age]}") }}Avantages et inconvénients d'Exposed
- Avantages : léger, contrôle total sur SQL, bonne intégration avec Kotlin Coroutines, communauté active.
- Inconvénients : absence de génération automatique de schéma (à créer manuellement), pas de support intégré des migrations (nécessite Flyway ou Liquibase).
2. Room — l'ORM officiel pour Android de Google
Room est une bibliothèque faisant partie d'Android Jetpack. Elle fournit une couche d'abstraction au-dessus de SQLite et génère automatiquement le code d'accès aux données. Room utilise des annotations et la compilation à l'étape de construction (KAPT ou KSP), ce qui garantit des performances élevées et la sécurité des types.
Exemple de code avec Room
// Entité@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)}
// Base de données@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}Avantages et inconvénients de Room
- Avantages : intégration complète avec Android, support de Flow et LiveData, génération automatique de code, migrations intégrées.
- Inconvénients : lié à la plateforme Android (ne convient pas aux applications serveur ou desktop), plus lourd par rapport à Exposed.
3. Ktorm — un ORM fonctionnel pour Kotlin
Ktorm est une bibliothèque ORM moderne qui propose un style fonctionnel de travail avec les bases de données. Elle n'utilise ni annotations ni réflexion, mais repose sur le DSL Kotlin et les extensions. Ktorm prend en charge de nombreux SGBD (MySQL, PostgreSQL, Oracle, SQLite, etc.) et peut fonctionner aussi bien avec JDBC qu'avec les dialectes SQL.
Exemple de code avec Ktorm
// Connexion et définition de la tableval database = Database.connect("jdbc:mysql://localhost/mydb", user = "root", password = "pass")
object Users : Table<Nothing>("users") { val id = int("id").primaryKey() val name = varch