L'élément foreach dans Mybatis est essentiel pour construire des conditions IN dynamiques dans les requêtes SQL, permettant d'itérer sur une collection de données.
Les attributs clés de foreach incluent :
- item : alias pour chaque élément lors de l'itération.
- index : nom représentant la position actuelle dans l'itération.
- collection : spécifie la collection à parcourir (varible selon le type de paramètre).
- open et close : délimiteurs de début et de fin de l'expression.
- separator : séparateur entre les éléments itérés.
L'attribut collection est critique et requiert une adaptation au type de paramètre. Voici quatre cas d'utilisation courants :
1. Paramètre unique de type List
Lorsque le paramètre est une liste (List), la valeur de collection est "list".
public List<Blog> recupererBlogsParListeIds(List<Integer> listeIds);
<select id="recupererBlogsParListeIds" parameterType="java.util.List" resultType="Blog">
SELECT * FROM t_blog WHERE id IN
<foreach collection="list" index="pos" item="identifiant" open="(" separator="," close=")">
#{identifiant}
</foreach>
</select>
2. Paramètre unique de type tableau (array)
Pour un tableau (array), collection prend la valeur "array".
public List<Blog> obtenirBlogsParTableauIds(int[] tableauIds);
<select id="obtenirBlogsParTableauIds" parameterType="int[]" resultType="Blog">
SELECT * FROM t_blog WHERE id IN
<foreach collection="array" index="index" item="idBlog" open="(" separator="," close=")">
#{idBlog}
</foreach>
</select>
3. Paramètres multiples encapsulés dans un Map ou un objet
Lorsque plusieurs paramètres sont requis, ils doivent être regroupés dans un Map ou un objet Java. collection correspond alors à la clé du Map ou à la propriété de l'objet.
Avec un Map :
public List<Blog> chercherBlogsParFiltres(Map<String, Object> filtres);
<select id="chercherBlogsParFiltres" parameterType="java.util.Map" resultType="Blog">
SELECT * FROM t_blog WHERE title LIKE CONCAT('%', #{titre}, '%') AND id IN
<foreach collection="ids" index="idx" item="element" open="(" separator="," close=")">
#{element}
</foreach>
</select>
Avec un objet :
public List<Blog> trouverBlogsParCritere(Blog critere);
<select id="trouverBlogsParCritere" parameterType="Blog" resultType="Blog">
SELECT * FROM t_blog WHERE title LIKE CONCAT('%', #{title}, '%') AND id IN
<foreach collection="identifiants" index="pos" item="ref" open="(" separator="," close=")">
#{ref}
</foreach>
</select>
4. Paramètre unique de type String avec séparation par virgules
Pour une chaîne de caractères (String) contenant des valeurs séparées par des virgules, utilisez "champ.split(',')" dans collection.
public List<Blog> localiserBlogsParChaineIds(String chaineIds);
<select id="localiserBlogsParChaineIds" parameterType="java.lang.String" resultType="Blog">
SELECT * FROM t_blog WHERE id IN
<foreach collection="chaineIds.split(',')" index="index" item="code" open="(" separator="," close=")">
#{code}
</foreach>
</select>