详细分析Mybatis中的<foreach>标签

这篇具有很好参考价值的文章主要介绍了详细分析Mybatis中的<foreach>标签。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

对于Java专栏:Java专栏
对于Mybatis的相关知识可看我之前的文章:Mybatis从入门到精通(全)
对于其余Java框架可看我之前的文章:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

对于上述Mybatis中曾有讲过foreach标签!此篇博客对其标签进行拓展

1. 基本语法

MyBatis中的<foreach>标签是用于迭代集合或数组的元素,生成对应的SQL片段,以便在动态SQL中使用。

该标签通常用于循环处理参数集合,生成多个相同的SQL片段,以实现批量操作或动态条件查询。

其基本的语法如下:

<foreach collection="collectionName" item="itemName" index="indexName" open="(" close=")" separator=",">
    #{itemName}
</foreach>

对应的属性如下:(只有collection和item是必选,其他都是可选参数)

  • collection: 指定要迭代的集合或数组的属性名,表示传入的参数的数据类型。
    该属性是必须指定的,用于指定要进行foreach操作的对象。
  • item: 指定在迭代过程中每个元素的别名,表示本次迭代获取的元素。
    若collection为List、Set或者数组,则表示其中的元素;
    若collection为map,则代表key-value的value。
    该参数是必选的。
  • index: 指定在迭代过程中每个元素的索引,仅对集合有效。
    在遍历List时,index表示元素的索引;在遍历Map时,index表示Map的key。该参数是可选的。
  • open: 指定迭代开始时的字符串,最常用的是左括弧'('
    MyBatis会将该字符拼接到整体的SQL语句之前,并且只拼接一次。该参数是可选的。
  • close: 指定迭代结束时的字符串,最常用的是右括弧')'
    MyBatis会将该字符拼接到整体的SQL语句之后。该参数是可选的。
  • separator: 指定每次迭代之间的分隔符。
    在SQL语句中,用于分隔不同元素的值。例如,1,2,3之间的,。该参数是可选的。

2. Demo

下面是一个简单的例子,假设有一个包含多个用户ID的集合,我们想要生成一个SQL语句查询这些用户:

<select id="selectUsersByIds" resultType="User">
    SELECT * FROM users
    WHERE id IN
    <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
        #{userId}
    </foreach>
</select>

在这个例子中,userIds是一个包含用户ID的集合,<foreach>标签会生成类似于IN (id1, id2, id3)的SQL片段。

另外,如果使用MyBatis的动态SQL功能,可以在<if>标签内使用<foreach>,以根据条件动态生成SQL片段,以下是一个例子,假设有一个条件查询的场景,根据用户选择的角色列表进行查询:

<select id="selectUsersByRoles" resultType="User">
    SELECT * FROM users
    <where>
        <if test="roles != null and roles.size > 0">
            AND id IN
            <foreach collection="roles" item="role" open="(" close=")" separator=",">
                #{role}
            </foreach>
        </if>
    </where>
</select>

在这个例子中,selectUsersByRoles是一个动态SQL查询,它根据用户传入的roles参数动态生成SQL条件。

  • 如果roles不为空且包含元素,那么<if>标签内的内容会生效,生成类似于AND id IN (role1, role2, role3)的SQL片段。
  • 如果roles为空或不包含元素,该条件会被忽略,从而生成不包含AND的SQL语句。

在实际应用中,这种动态SQL的使用可以根据不同的业务需求动态构建查询条件,使SQL语句更加灵活和可复用。

3. 实际例子

结合实战中的例子,讲解更加透彻文章来源地址https://www.toymoban.com/news/detail-785557.html

  • 批量插入,即列表中有多个元素,代码示例:
<insert id="saveForList" parameterType="java.util.List">
    INSERT INTO E_DEVICE_TEMP_ALARM_HIST(DEVICE_NAME, BATTERY_TEMP, SEND_TO_DRIVER, CREATE_TIME, UPDATE_TIME, SENDER, SUGGESTION)
    <foreach collection="temperatureAlarmHistList" item="temperatureAlarmHist" separator="union all" open="(" close=")">
        SELECT
        #{temperatureAlarmHist.deviceName, jdbcType=VARCHAR},
        #{temperatureAlarmHist.batteryTemp, jdbcType=VARCHAR},
        #{temperatureAlarmHist.sendToDriver, jdbcType=INTEGER},
        #{temperatureAlarmHist.createTime, jdbcType=DATE},
        #{temperatureAlarmHist.updateTime, jdbcType=DATE},
        #{temperatureAlarmHist.sender, jdbcType=VARCHAR},
        #{temperatureAlarmHist.suggestion, jdbcType=VARCHAR}
        FROM DUAL
    </foreach>
</insert>
  • 动态SQL语句,更新语句也同理:
<update id="removeRuleDetailByRuleId"  >
    update equipment_change_shifts_rule_detail set is_deleted = 1 where rule_id IN
    <foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
        #{id}
    </foreach>
</update>
  • 结合if语句,且参数位置可以随意:
<select id="trees" resultMap="treeNodeResultMap">
    select id, parent_id, equipment_name as title, id as 'value', id as 'key',location from equipment_architecture where is_deleted = 0
    <if test="tenantId!=null">
        and tenant_id = #{tenantId}
    </if>
    and id in
    <foreach close=")" collection="ids" item="listItem" open="(" separator=",">
        #{listItem}
    </foreach>
</select>

到了这里,关于详细分析Mybatis中的<foreach>标签的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis中 collection 和 association 标签 的区别

    collection 和 association 是 MyBatis 中用于定义映射关系的标签,它们的区别如下: 目标对象类型: collection 用于表示集合属性,即一个属性对应多个关联对象。 association 用于表示关联属性,即一个属性对应一个关联对象。 关联关系处理: collection 用于处理一对多或多对多的关联

    2024年02月09日
    浏览(45)
  • MyBatis Plus Mapper.xml映射文件常用标签<if>、<foreach>、#{}、${}等

    一、判断 Integer、Long 等常数类参数 注意:判断常数类参数,只能判断 != null,不能判断 != \\\'\\\' 否则判断不会生效 二、判断 String 字符串类参数 注意:判断字符串类参数可以判断 != \\\'\\\' 三、判断参数值与指定的值,是否相等或不相等 注意: 1、判断 Integer、Long 等常数类型等于

    2024年02月09日
    浏览(58)
  • Spring+MyBatis使用collection标签的两种使用方法

    目录 项目场景: 实战操作: 1.创建菜单表 2.创建实体  3.创建Mapper 4.创建xml  属性描述: 效率比较: 本文说明了Spring Boot+MyBatis使用collection标签的两种使用方法 1. 方法一: 关联查询 2. 方法二: 嵌套select查询 这里只创建一张表,树结构只有两级,方便学习,多表关联是同样的

    2024年02月09日
    浏览(60)
  • MyBatis动态sql之批量修改、批量新增(使用foreach标签的一条sql语句解决)

            批量新增和批量修改在业务中是很常见的,一条sql访问数据库和通过代码循环体中循环访问数据库做单个数据新增修改相比较下:一条sql访问数据库性能上明显提升,代码且简洁明了 1、Mapper.java中 说明: 参数是list  2、Mapper.xml中 说明: 通过trim标签拼接前后缀和

    2024年02月10日
    浏览(53)
  • 在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?

    在 MyBatis 中,您可以使用动态 SQL 标签来构建灵活的 SQL 查询,以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法: 1. **`if` 标签:** 用于根据某个条件动态地包含或排除 SQL 片段,test:可以写条件。    示例用法:        ```xml    select id=\\\"getUserList\\\" param

    2024年02月11日
    浏览(48)
  • 【Mybatis源码分析】Mybatis中的反射(MetaObject)详细讲解

    在使用Mybatis,编写DQL语句时,查询结果可能会是多个,多变量指定肯定是不现实的。而Mybatis可以进行映射,将JDBC返回的结果映射到实例类或者Map对象中,方便开发者直接使用返回对象,就可以得到从数据库取出来的结果。 映射原理大伙都知道是利用了反射(因为咱就只是通

    2023年04月08日
    浏览(77)
  • mybatis双重foreach实现遍历map中的两个list数组

    前端传值时可能会有多个字段传递过来,需要后台将这多个字段拼接为 name in (? , ?) and name1 in (? , ?) and name2 in (? , ?) 作为sql查询条件…如下图sql语句,即实现多个and xxx in(?,?,?) 拼接 前端传递的是json字符串,json中name和infos是一对具有对应关系的对象,且json中会有多条这种对象

    2024年02月15日
    浏览(41)
  • 玩转代码|Script 标签中的async与defer属性详细分析

    在面试的时候,经常会遇到一道经典的面试题: 如何优化网页加载速度? 常规的回答中总会有一条: 把 css 文件放在页面顶部,把 js 文件放在页面底部。 那么,为什么要把 js 文件放在页面的最底部呢? 我们先来看下这段代码: 他的执行顺序是: 在控制台打印: Howdy ~ 请

    2024年02月15日
    浏览(44)
  • 【MyBatis】四、MyBatis中的动态SQL标签

    动态SQL语句是动态的拼接Mybatis中SQL语句的情况,可以动态的在Mybatis中使用SQL if语句的xml文件: 传入对象来进行调用: where标签中的and会被自动去掉,并且若没有合适的内容,则不会添加where 注意:where标签只能去掉条件前的and、五福去掉条件后的and trim标签会在其内容

    2024年02月09日
    浏览(41)
  • 「问题」如何解决 MyBatis 中的 if 标签无法识别参数为 0 的问题

    mybatis中的自己写的判断方法,若参数 buildingType=0 ,则不会进入到方法中 mybatis源码如下所示: 代码解释: 这是一个将字符串转换为 double 类型的操作。代码中使用了三元运算符 ?: 来判断字符串的长度是否为 0。如果字符串为空,则返回 0.0D(double 类型的零值),否则使用

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包