【mybatis】标签foreach数组批量执行操作

项目使用过程中,有很多地方需要用到批量删除、批量插入、批量更新、批量查询,这样的需求就会用到mybatis中的foreach标签

在这里插入图片描述

foreach的属性

  • item:集合中元素迭代时的别名,必填
  • index:在list和array中,index是元素的序号;在map中,index是元素的key,可选
  • open:foreach代码的开始符号,一般是'('并和')'合用,常用在in(),values()时,可选
  • separator:元素之间的分隔符,可选
  • close:foreach代码的关闭符号,一般是'('并和')'合用,常用在in(),values()时,可选
  • collection:foreach迭代的对象,作为入参时,List对象默认用list代替,数组对象用array代替。Map对象没有默认的键。同时可以在作为入参时使用@param(“xxx”)来设置键,默认的list、array将会失效。

列表配置

选择mybatis类型,然后编写script脚本
在这里插入图片描述

温馨说明: 前端数组传到服务端进行转换。两个下划线__是双下滑

前端查询请求参数:
"A5" : [ "543", "544" ]

后端经过处理参数:
"A5" : "543,544",
"A5__0" : "543",
"A5__1" : "544",
"A5__origin" : [ "543", "544" ]

使用mybatis进行开发时,在一个SQL语句中需要拼接list的大小。如果需要遍历list,那么先对list进行非空判断的时候。

<if test="A5__origin != null and A5__origin.size != 0" >

脚本参考

批量查询(举例)

<script>
SELECT ATTA_ID , FILE_PATH ,A5 FROM SS_SYS_ATTACHMENT WHERE 1=1 
  <if test="A5__origin != null and A5__origin.size != 0" >
     AND A5 IN 
    <foreach collection="A5__origin" index="index" item="item" open="(" separator="," close=")">  
  	  #{item}  
  </foreach> 
  </if>
</script>

或者

<script>
SELECT ATTA_ID , FILE_PATH ,A5 FROM SS_SYS_ATTACHMENT WHERE 1=1 AND A5 IN 
  <foreach collection="A5__origin" index="index" item="item" open="(" separator="," close=")">  
  	#{item}  
  </foreach> 
</script>

批量新增(举例)

<script>
    insert into user_info
    (user_id,user_name,create_id, create_time)
    values
    <foreach collection="A5__origin" index="index" item="item" separator=",">
        (#{item.userId,jdbcType=VARCHAR}, #{item.userName,jdbcType=VARCHAR},
        #{item.createId,jdbcType=BIGINT},  #{item.createTimee,jdbcType=TIMESTAMP})
    </foreach>
</script>

批量更新(举例)

<script>
    update ss_sys_file set IS_DELETE='1'
    where id in
    <foreach collection="A5__origin" index="index" item="item" separator="," open="(" close=")">
        #{item,jdbcType=VARCHAR}
    </foreach>
</script>

✨ 批量获取(举例)

  • ds2用ds1值查询
    在这里插入图片描述

  • 原因
    因为ds2里面CHECK_NAME是使用的是ds1.CHECK_NAME,所有先再配置里面字段配置默认值为{{ds1.CHECK_NAME}}
    由于,ds2里面使用自定义mybitis脚本,所有需要去识别判断,服务端识别到这个默认值后,获取ds1下面的对象CHECK_NAME值,然后把key转换,value获取,例如:

key:   由【ds1.CHECK_NAME】转换,譬如:【ds1__CHECK_NAME】
value: 取【ds1.CHECK_NAME】获取,譬如:【任务名称,测试】
  • 解决
<if test="{{ds1.CHECK_NAME}} != null">
or CHECK_NAME in 
    <foreach collection="ds1__CHECK_NAME" index="index" item="item" separator="," open="(" close=")">
        #{item,jdbcType=VARCHAR}
    </foreach>
</if>

接口请求

访问地址:http://localhost/api/form/query?ID=6668

请求参数:

{
  "ds1": {"A5": ["543", "544"]}
}

查询结果:

{
    "data": {
        "ds1": {
            "data": [
                {
                    "ATTA_ID": "626ef427-c62a-4b43-a474-41fbbd3e42c7",
                    "A5": "5432",
                    "FILE_PATH": "/upload/2022-05-09/5432.jpg"
                },
                {
                    "ATTA_ID": "b411135b-5708-7714-8b93-40c0958c2ec8",
                    "A5": "5441",
                    "FILE_PATH": "/upload/2022-05-09/5441.jpg"
                }
            ],
            "paging": {
                "pageIndex": 0,
                "pageSize": 0,
                "totalPage": 0,
                "totalRecord": 0
            },
            "total": 0,
            "error_info": {}
        }
    },
    "message": "",
    "paging": null,
    "schema": null,
    "success": true,
    "timestamp": 1617953697587
}

官方文档

动态SQL直通车

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

其他文档

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis中的<foreach>标签有六个属性,分别是collection、item、separator、open、close和index。 - collection属性用于指定循环的集合,可以是list、array或map类型的参数。 - item属性用于指定集合中的每个元素在循环过程中的参数名。 - separator属性用于指定每个子循环结束后的分隔符,默认为逗号。 - open属性用于指定循环开始的符号,默认为空。 - close属性用于指定循环结束的符号,默认为空。 - index属性用于指定集合中元素的索引,只在list、array和map类型参数中有效。索引从0开始自增,相当于数组下标。 这些属性可以根据需要来灵活配置,以满足各种循环操作的需求。在Mybatis中,<foreach>标签常用于批量插入或批量更新表数据的操作。在批量插入中,可以使用<foreach>标签将多个参数值拼接成一条SQL语句,以提高执行效率。在批量更新中,可以使用<foreach>标签将多个参数值作为IN函数的参数,来更新满足条件的记录。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mybatisforeach标签带来的空格\换行\回车问题及解决方案](https://download.csdn.net/download/weixin_38609401/12725727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mybatis标签<foreach>详解](https://blog.csdn.net/qq_36631553/article/details/105680200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掘金者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值