Qu'est-ce qu'Exposed et pourquoi en a-t-on besoin ?
\n\nExposed est une bibliothèque ORM (Object-Relational Mapping) légère mais puissante pour le langage de programmation Kotlin, développée par la société JetBrains. Elle propose deux approches principales pour travailler avec les bases de données : DSL (Domain Specific Language) et DAO (Data Access Objects).
\n\nPourquoi Exposed est-il nécessaire ?
\n- \n
- Sécurité des types : Contrairement aux requêtes SQL brutes, Exposed utilise des constructions typées de Kotlin, ce qui permet de détecter les erreurs dès la compilation. \n
- Concision : Le code avec Exposed est nettement plus court et plus lisible que les requêtes SQL équivalentes ou le code Java avec JPA. \n
- Performance : Exposed n'utilise ni réflexion ni objets proxy (contrairement à Hibernate), ce qui le rend très rapide et prévisible. \n
- Flexibilité : Vous pouvez facilement basculer entre DSL (pour les requêtes complexes) et DAO (pour les opérations CRUD simples) au sein d'un même projet. \n
- Support de multiples bases de données : PostgreSQL, MySQL, MariaDB, SQLite, H2, Oracle, SQL Server. \n
Installation d'Exposed
\n\nExposed s'installe via le système de construction Gradle ou Maven. Ajoutez les dépendances suivantes dans votre build.gradle.kts :
dependencies {\n // Bibliothèque principale\n implementation("org.jetbrains.exposed:exposed-core:0.44.1")\n // DSL pour les requêtes\n implementation("org.jetbrains.exposed:exposed-dao:0.44.1")\n // Pilote JDBC pour votre base de données (exemple pour PostgreSQL)\n implementation("org.postgresql:postgresql:42.7.1")\n // Pool de connexions HikariCP (recommandé)\n implementation("com.zaxxer:HikariCP:5.1.0")\n // Journalisation SQL (optionnel)\n implementation("ch.qos.logback:logback-classic:1.4.14")\n}\n\nPour Maven (pom.xml) :
<dependency>\n <groupId>org.jetbrains.exposed</groupId>\n <artifactId>exposed-core</artifactId>\n <version>0.44.1</version>\n</dependency>\n\nDémarrage rapide : exemple de code
\n\nCréons une application simple de gestion de tâches (ToDo) :
\n\nimport org.jetbrains.exposed.sql.*\nimport org.jetbrains.exposed.sql.transactions.transaction\nimport org.jetbrains.exposed.sql.SqlExpressionBuilder.eq\nimport java.time.LocalDateTime\n\n// 1. Définir la table\nobject Tasks : Table() {\n val id = integer("id").autoIncrement()\n val title = varchar("title", 255)\n val description = text("description").nullable()\n val isCompleted = bool("is_completed").default(false)\n val createdAt = datetime("created_at").default(LocalDateTime.now())\n\n override val primaryKey = PrimaryKey(id)\n}\n\n// 2. Data class pour plus de commodité\ndata class Task(\n val id: Int,\n val title: String,\n val description: String?,\n val isCompleted: Boolean,\n val createdAt: LocalDateTime\n)\n\nfun main() {\n // 3. Connexion à la base de données (H2 en mémoire pour l'exemple)\n Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")\n\n transaction {\n // 4. Créer la table\n SchemaUtils.create(Tasks)\n\n // 5. Insérer des données\n val insertId = Tasks.insert {\n it[title] = "Apprendre Exposed"\n it[description] = "Lire la documentation et écrire un exemple"\n } get Tasks.id\n\n println("Tâche insérée avec l'ID : $insertId")\n\n // 6. Sélectionner toutes les tâches\n val allTasks = Tasks.selectAll().map { row ->\n Task(\n id = row[Tasks.id],\n title = row[Tasks.title],\n description = row[Tasks.description],\n isCompleted = row[Tasks.isCompleted],\n createdAt = row[Tasks.createdAt]\n )\n }\n println("Toutes les tâches : $allTasks")\n\n // 7. Mettre à jour une tâche\n Tasks.updat Aussi dans la bibliothèque
Client Redis pour Rust : présentation de la bibliothèque redis-rs
Surveillance des applications .NET avec Prometheus et OpenTelemetry
Travailler avec XML en JavaScript (Node.js) : bibliothèques et exemples
Mise en cache en Rust : Redis, Memcached et solutions intégrées
iText 7 pour Java : guide complet avec exemples pratiques