Introduction : Pourquoi Kotlin pour travailler avec des bases de données ?
Kotlin est un langage moderne à typage statique, totalement compatible avec Java, et activement utilisé pour créer des applications back-end. Grâce à sa syntaxe concise, sa sécurité contre les valeurs nulles et ses outils puissants, Kotlin est idéal pour travailler avec des bases de données relationnelles (PostgreSQL) et orientées documents (MongoDB). Dans cet article, nous analyserons des exemples pratiques de connexion, d'opérations CRUD et d'optimisation de requêtes.
Nous examinerons deux bibliothèques populaires : Exposed (pour PostgreSQL) et KMongo (pour MongoDB). Vous apprendrez à configurer l'environnement, à écrire des requêtes efficaces et à éviter les erreurs courantes.
1. Travailler avec PostgreSQL via Exposed
Exposed est une bibliothèque ORM pour Kotlin qui fournit deux API : DSL (Domain-Specific Language) pour écrire des requêtes dans le style SQL et DAO (Data Access Object) pour une approche orientée objet. Examinons les deux options.
1.1. Connexion et configuration
Ajoutez les dépendances dans build.gradle.kts :
dependencies { implementation("org.jetbrains.exposed:exposed-core:0.41.1") implementation("org.jetbrains.exposed:exposed-dao:0.41.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.41.1") implementation("org.postgresql:postgresql:42.5.0")}Connexion à la base de données :
import org.jetbrains.exposed.sql.Databaseimport org.jetbrains.exposed.sql.transactions.transaction
fun main() { Database.connect( url = "jdbc:postgresql://localhost:5432/mydb", driver = "org.postgresql.Driver", user = "user", password = "password" ) println("Connexion à PostgreSQL établie")}1.2. Création d'une table et opérations CRUD (DSL)
Définissons la table Users :
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.insertimport org.jetbrains.exposed.sql.selectAllimport org.jetbrains.exposed.sql.update
object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 50) val email = varchar("email", 100).uniqueIndex() override val primaryKey = PrimaryKey(id)}Effectuons des opérations CRUD :
transaction { // Création d'une table SchemaUtils.create(Users)
// INSERT Users.insert { it[name] = "Alexey" it[email] = "alex@example.com" }
// SELECT val users = Users.selectAll().map { "${it[Users.id]}: ${it[Users.name]} (${it[Users.email]})" } println(users)
// UPDATE Users.update({ Users.id eq 1 }) { it[name] = "Alexey Ivanov" }
// DELETE (en utilisant deleteWhere) Users.deleteWhere { Users.id eq 2 }}1.3. Approche DAO
Créons une entité et une classe DAO :
import org.jetbrains.exposed.dao.IntEntityimport org.jetbrains.exposed.dao.IntEntityClassimport org.jetbrains.exposed.dao.id.EntityIDimport org.jetbrains.exposed.dao.id.IntIdTable
object UsersDAO : IntIdTable() { val name = varchar("name", 50) val email = varchar("email", 100)}
class User(id: EntityID<Int>) : IntEntity(id) { companion object : IntEntityClass<User>(UsersDAO) var name by UsersDAO.name var email by UsersDAO.email}
// Utilisationtransaction { val newUser = User.new { name = "Maria" email = "maria@example.com" } println("Utilisateur créé avec l'ID : ${newUser.id.value}")}2. Travailler avec MongoDB via KMongo
KMongo est un pilote orienté coroutines pour MongoDB, construit au-dessus du pilote Java officiel. Il prend en charge la sérialisation via kotlinx.serialization et Jackson.
2.1. Connexion à KMongo
Ajoutez dans build.gradle.kts :