Dans l'écosystème MyBatis-Plus, la manipulation des données est simplifiée par l'utilisation de l'EntityWrapper (EW) et de la classe Condition. Ces composants agissent comme des constructeurs de critères fluides, permettant de générer dynamiquement des clauses SQL complexes sans avoir à écrire manuellement du XML ou des chaînes de caractères brutes. Cette approche améliore la maintenabilité du code et accélère le développement des couches d'accès aux données.
Un pointt crucial à retenir : lors de la définition des filtres, les méthodes se basent sur les noms des colonnes de la base de données et non sur les noms des attributs de vos classes Java.
Tests de sélection et filtrage
L'exemple suivant illustre comment effectuer une recherche paginée sur une table d'utilisateurs en filtrant par tranche d'âge, genre et nom spécifique.
@Test
public void filtrageUtilisateurs() {
// 1. Recherche paginée des utilisateurs (18 à 50 ans, sexe masculin, nom "Jean")
List<Utilisateur> liste1 = userMapper.selectPage(
new Page<Utilisateur>(1, 5),
new EntityWrapper<Utilisateur>()
.between("age", 18, 50)
.eq("genre", 1)
.eq("nom_famille", "Jean")
);
System.out.println(liste1);
// 2. Alternative utilisant la classe Condition pour la même requête
List<Utilisateur> liste2 = userMapper.selectPage(
new Page<Utilisateur>(1, 5),
Condition.create()
.between("age", 18, 50)
.eq("genre", "1")
.eq("nom_famille", "Jean")
);
System.out.println(liste2);
}
Logique booléenne et opérateurs avancés
MyBatis-Plus permet de structurer des conditions logiques complexes, notamment avec l'utilisation de or() et orNew() pour gérer les parenthèses SQL.
@Test
public void rechercheAvancee() {
// Recherche : Sexe féminin ET (Nom contenant "Prof" OU Email contenant "edu")
List<Utilisateur> resultats = userMapper.selectList(
new EntityWrapper<Utilisateur>()
.eq("genre", 0)
.like("nom_famille", "Prof")
.orNew() // SQL : (genre = ? AND nom_famille LIKE ?) OR (email LIKE ?)
.like("email", "edu")
);
System.out.println(resultats);
}
Tri et personnalisation des requêtes
L'EntityWrapper offre des méthodes pour ordonner les résultats et même injecter des fragments SQL en fin de commnade via la méthode last().
@Test
public void triEtPagination() {
// Sélection des femmes, triées par âge avec une limite personnalisée
List<Utilisateur> trie = userMapper.selectList(
new EntityWrapper<Utilisateur>()
.eq("genre", 0)
.orderBy("age") // Tri ascendant
.last("desc limit 0, 10") // Injection directe en fin de SQL
);
System.out.println(trie);
}
Mise à jour et suppression basées sur des critères
Les wrappers ne servent pas uniquement à la lecture. Ils permettent de définir précisément la cible d'une modification ou d'une suppression sans charger l'objet au préalable.
@Test
public void operationsModification() {
// Mise à jour de l'email pour un utilisateur spécifique identifié par son nom et son âge
Utilisateur data = new Utilisateur();
data.setNomFamille("Martin");
data.setEmail("nouveau.martin@exemple.fr");
userMapper.update(data,
new EntityWrapper<Utilisateur>()
.eq("nom_famille", "AncienNom")
.eq("age", 30)
);
}
@Test
public void operationsSuppression() {
// Suppression basée sur des critères multiples
userMapper.delete(
new EntityWrapper<Utilisateur>()
.eq("nom_famille", "Test")
.eq("age", 99)
);
}