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

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

【mybatis】标签foreach数组批量执行操作_第1张图片

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脚本
【mybatis】标签foreach数组批量执行操作_第2张图片

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

前端查询请求参数:
"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】获取,譬如:【任务名称,测试】
  • 解决

or CHECK_NAME in 
    
        #{item,jdbcType=VARCHAR}
    

接口请求

访问地址: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

其他文档

  • mybatis动态sql
  • mybatis动态sql

你可能感兴趣的:(通用表单,mybatis,java)