Java Mybatis

foreach元素的属性主要有 item,index,collection,open,separator,close。

属性 说明
item 表示集合中每一个元素进行迭代时的别名,
index 指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open 表示该语句以什么开始,
separator 表示在每次进行迭代之间以什么符号作为分隔符,
close 表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,就需要把它们封装成一个Map了,当然单参数也可

    案例例子

    一、通过id获取多条数据

    List 类型的都配置了别名list,参数是 List<Article> ,Article 是自己定义的实体类
    1. <!-- 获取标签文章列表 -->
    2. <select id="getArticleList" parameterType="list" resultType="pm">
    3. SELECT * from blog_article a where a.article_id in
    4. <foreach item="item" collection="list" index="index" open="(" separator="," close=")">
    5. #{item.article_id}
    6. </foreach>
    7. and isdel = 0
    8. order by a.create_time desc,a.update_time desc
    9. </select>

    二、批量插入数据

    1. <!-- 批量新增-->
    2. <insert id="batchSaveArticleLabel" parameterType="list">
    3. insert into blog_article_label( article_id, label_id ) values
    4. <foreach collection="list" item="item" index="index" separator="," >
    5. ( #{item.article_id}, #{item.label_id} )
    6. </foreach>
    7. </insert>

    三、对一个字段进行多次模糊匹配

    1. select * from table
    2. <where>
    3. <foreach collection="list" item="item" index="index" separator="or">
    4. name like '%${item}%'
    5. </foreach>
    6. </where>
    上面的参数都是 List,如果是 String[] 这种的就是把collection 的值改为array,如下demo

    四、批量删除

    1. <delete id="getArticleList" parameterType="String">
    2. DEKETE from blog_article a
    3. where a.article_id in
    4. <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
    5. #{item}
    6. </foreach>
    7. </delete>

    五、批量修改

    参数是 Map<String,Object> ,下面写map 是因为配置了别名
    Java 代码是这样的:
    1. Map<String,Object> map = new HashMap<>();
    2. String[] ids = {"1","2","3"};
    3. map.put("content","修改的内容");
    4. map.put("ids",ids);
    mapper 文件
    1. <update id="update" parameterType="map">
    2. UPDATE table
    3. SET content="#{content}"
    4. WHERE id in
    5. <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
    6. #{item}
    7. </foreach>
    8. </update>

    还有一种

    1. <update id="updateUserChildNum" parameterType="list">
    2. UPDATE usr_relation_umbrella
    3. SET child_number = CASE user_id
    4. <foreach collection="list" item="item">
    5. WHEN #{item.userId} THEN #{item.childNumber}
    6. </foreach>
    7. END
    8. WHERE user_id IN
    9. <foreach item="item" collection="list" index="index" open="(" separator="," close=")">
    10. #{item.userId}
    11. </foreach>
    12. </update>

    多个

    1. UPDATE categories
    2. SET display_order = CASE id
    3. WHEN 1 THEN 3
    4. WHEN 2 THEN 4
    5. WHEN 3 THEN 5
    6. END,
    7. title = CASE id
    8. WHEN 1 THEN 'New Title 1'
    9. WHEN 2 THEN 'New Title 2'
    10. WHEN 3 THEN 'New Title 3'
    11. END
    12. WHERE id IN (1,2,3)