• MyBatis `<foreach>`


    概念:

    MyBatis元素中,collectionitemopencloseseparatorindex这些属性都有特定的含义,它们一起定义了如何迭代集合并为SQL语句生成相应的片段。下面是对这些属性的详细解释

    1. collection:

      • 意义: 指定要遍历的集合或数组的名称。

      • 用途: 告诉MyBatis从哪个集合或数组中获取元素来构建SQL。

      • 示例: 如果你的参数是一个Map,并且你想遍历这个Map的键,那么你可以这样写:collection="map.keys"

        如果参数是一个List,那么你可以直接写:collection="list"

    2. item:

      • 意义: 指定每次迭代时的当前元素的变量名。

      • 用途: 在标签内部,你可以使用这个变量来引用当前迭代到的元素。

      • 示例: 如果你的集合包含字符串,你可以写:item="str",然后在内部使用${str}来引用当前字符串。

    3. open和close:

      • 意义: 这两个属性分别指定了生成的SQL片段的开始和结束字符串。

      • 用途: 当你想要包裹整个遍历生成的SQL片段时,这两个属性非常有用。

      • 示例: 对于一个IN子句,你可能会这样写:open="("close=")",这会生成一个被括号包裹的列表。

    4. separator:

      • 意义: 指定迭代过程中生成的每个元素之间的分隔符。

      • 用途: 当你想要把多个元素连接起来时,比如在IN子句中,你需要用逗号分隔不同的值。

      • 示例: 对于IN子句,你可以写:separator=",",这样每个值之间都会用逗号分隔。

    5. index:

      • 意义: 当遍历集合时,指定用于引用当前元素索引的变量名。

      • 用途: 对于某些集合,比如List或数组,你可能想要引用元素的索引(位置)。

      • 示例: 如果你正在遍历一个List,并且想要同时获取元素的值和它的索引,你可以写:index="idx"item="value",然后在内部使用${idx}#{value}

    这些属性通常一起使用,以便能够灵活地构建各种SQL语句片段。通过组合这些属性,你可以创建复杂的SQL语句,这些语句在运行时可以动态地根据输入数据变化。

    理解

    foreach `循环标志

    collection、 拿到的集合。List 或 Map

    index 集合中的每一个对象 的 下标 或 键

    item、 集合中的每一个对象 的 值

    open、 循环开始前

    close、 循环结束后

    separator 每层循环的分隔符

      
            (#{user.id}, #{user.name}, #{user.age})  
      
    ​
      
        ${key} = #{map[key]}  
      
        ${key} = #{value}  
    

    例子

    下面我将给出几个使用MyBatis 元素属性的具体例子,这些例子展示了如何根据提供的集合或数组动态构建SQL语句。

    例子 1: 遍历集合插入多条记录

    假设我们有一个用户列表,并且想要一次性插入这些用户到数据库中。

    Mapper XML:

      
        INSERT INTO users (id, name, age)  
        VALUES  
          
            (#{user.id}, #{user.name}, #{user.age})  
          
    

    在这个例子中,collection="list" 指定了我们要遍历的集合,item="user" 是每次迭代时当前元素的变量名。separator="," 表示每个插入的元组之间用逗号分隔。

    例子 2: 使用IN子句查询数据

    如果我们想要根据ID列表查询用户,我们可以使用IN子句。

    Mapper XML:

    在这个例子中,open="("close=")" 分别指定了IN子句的开始和结束括号。separator="," 表示每个ID之间用逗号分隔。

    例子 3: 使用索引和值遍历Map

    假设我们有一个Map,其中键是列名,值是对应的值,我们想要根据这个Map动态构建UPDATE语句。

    Mapper XML:

      
        UPDATE users  
          
            ${key} = #{value}  
          
        WHERE id = #{id}  
    

    在这个例子中,collection="map" 指定了我们要遍历的Map,item="value" 是每次迭代时当前值的变量名,index="key" 是每次迭代时当前键的变量名。separator="," 表示每个字段的更新语句之间用逗号分隔。

    例子 4: 遍历数组插入数据

    如果我们有一个ID数组,并想要根据这些ID插入到另一个表中,可以这样做:

    Mapper XML:

      
        INSERT INTO related_ids (user_id)  
        VALUES  
          
            (#{id})  
          
    

    在这个例子中,collection="array" 指定了我们要遍历的是数组。其他属性和之前例子中的用法相同。

    这些例子展示了如何灵活地使用MyBatis的元素来构建动态SQL语句。你可以根据实际需求调整collectionitemopencloseseparatorindex等属性的值。

    例子 5: 批量插入数据

    Integer insertBathData(@Param("tableName")String tableName,@Param("paramMap")Map paramMap,@Param("dataList")List>dataList);
    INSERT INTO ${tableName}
    
        ${key}
      //遍历map的键
    values
    //遍历list>
        //遍历每个值
            #{value}
        
    

    效果:

    INSERT INTO some_table (name, age)

    VALUES (value1_for_name, value1_for_age), (value2_for_name, value2_for_age)

  • 相关阅读:
    网页制作基础大二dw作业HTML+CSS+JavaScript云南我的家乡旅游景点
    Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上
    【分享】“明道云“ 在集简云平台集成应用的常见问题与解决方案
    智能井盖传感器:提升城市安全与便利的利器
    linux安装scrcpy最新版本
    推荐系统(LLM去偏?) | (WSDM24)预训练推荐系统:因果去偏视角
    文献阅读(37)——使用深度卷积神经网络的增强型糖网检测和分类的方法
    FFmpeg和SDL实现视频播放器之 ⌈视频播放⌋
    003 topic
    Hazelcast系列(三):hazelcast集成(服务器/客户端)
  • 原文地址:https://blog.csdn.net/qq_53845825/article/details/137964387