Relations des constructeurs de conditions dans MyBatis-Plus
Dans l'architecture de MyBatis-Plus, les wrappers servent à assembler des clauses SQL dynamiques. Les composants abstraits fournissent une base commune, tandis que les implémentations concrètes permettent l'instanciation directe. Les relations d'héritage sont explicitées par des liens dirigés des classes dérivées vers leurs ancêtres.
Wrapper de requête (QueryWrapper)
Cette classe étend AbstractWrapper et intègre une propriété entity pour la construction des conditions WHERE. Une instance de WrapperRequeteLambda peut être obtenue via la méthode lambda() de l'objet QueryWrapper.
@Test
public void effectuerRecherche() {
WrapperRequete<produit> wrapperRequete = new WrapperRequete<>();
// Définir les colonnes à récupérer
wrapperRequete.select("designation", "prix_unitaire");
// Filtrer les colonnes basé sur une condition
wrapperRequete.select(Produit.class, col -> !"archive".equals(col.getStatut()));
// Appliquer un filtre conditionnel pour éviter les valeurs nulles
wrapperRequete.eq(StrUtil.isNotEmpty(nomProduit), "nom", "Ecran HD");
List<produit> resultats = serviceProduit.list(wrapperRequete);
resultats.forEach(element -> System.out.println(element.getDesignation()));
// Utilisation de l'opérateur OR
WrapperRequete<produit> wrapperCondition = new WrapperRequete<>();
wrapperCondition.eq("categorie", "electronique");
wrapperCondition.and(cond -> cond.eq("stock", 50).or().eq("disponibilite", true));
}
</produit></produit></produit>
Wrapper de mise à jour (UpdateWrapper)
Héritant de AbstractWrapper, cette classe utilise également l'atrtibut entity pour les conditions de mise à jour. Un WrapperMiseAJourLambda est accessible par la méthode lambda() d'une instance UpdateWrapper.
@Test
public void appliquerModification() {
WrapperMiseAJour<commande> wrapperModif = new WrapperMiseAJour<>();
// Modifier une valeur de champ
wrapperModif.set("statut", "livree");
// Insérer un fragment SQL personnalisé
wrapperModif.setSql("montant_total = 150.00");
// Spécifier la condition de mise à jour
wrapperModif.eq("identifiant", idCommande);
boolean succes = serviceCommande.update(wrapperModif);
}
</commande>
Wrapper de requête Lambda (LambdaQueryWrapper)
Cette variante offre une approche typée pour la construction de conditions, réduisant les risques d'erreurs liées aux noms de colonnes.
@Test
public void rechercheParLambda() {
LambdaWrapperRequete<adresse> wrapperLambda = new LambdaWrapperRequete<>();
wrapperLambda.eq(Adresse::getCodePostal, codePostal)
.between(Adresse::getDateCreation, dateDebut, dateFin);
wrapperLambda.eq(StrUtil.isNotEmpty(ville), Adresse::getVille, "Lyon");
List<adresse> adresses = this.list(wrapperLambda);
}
</adresse></adresse>
Wrapper de mise à jour Lambda (LambdaUpdateWrapper)
Permet d'exécuter des opérations de mise à jour de manière type-safe, combinant critères et modifications.
@Test
public void miseAJourViaLambda() {
LambdaWrapperMiseAJour<compteutilisateur> wrapperUpdate = new LambdaWrapperMiseAJour<>();
wrapperUpdate.eq(CompteUtilisateur::getLogin, identifiant)
.le(CompteUtilisateur::getTentatives, 5)
.set(CompteUtilisateur::getActif, false)
.setSql("derniere_connexion = CURRENT_TIMESTAMP");
this.update(wrapperUpdate);
}
</compteutilisateur>
Personnalisation de SQL avec les Wrappers
Pour intégrer des requêtes SQL sur mesure, défniissez une méthode dans le mapper avec un paramètre annoté @Param(Constants.WRAPPER). Ajoutez ensuite le segment ${ew.customSqlSegment} dans votre instruction SQL.
Via annotation (Mapper.java)
@Select("SELECT * FROM inventaire ${ew.customSqlSegment}")
List<articleinventaire> recupererArticles(@Param(Constants.WRAPPER) Wrapper wrapper);
</articleinventaire>
Via fichier XML (Mapper.xml)
<select id="recupererArticles" resulttype="ArticleInventaire">
SELECT * FROM inventaire ${ew.customSqlSegment}
</select>