Maîtriser l'Utilisation de foreach dans Mybatis pour les Requêtes IN

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>

Étiquettes: MyBatis foreach SQL Java collections

Publié le 10 juin à 00h15