MyBatis<foreach>标签的用法

ops/2024/9/23 22:23:57/

文章目录

  • 1. foreach 标签
  • 2. MyBatis<foreach>标签的使用
    • 2.1 批量插入
    • 2.2 批量编辑
    • 2.3 批量查询
      • 2.4 使用 foreach 遍历 map

1. foreach 标签

foreach 可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。

  • collection 指定要遍历的集合。表示传入过来的参数名。该属性是必须指定的,要做 foreach 的对象。
  • item 表示本次迭代获取的元素,若 collection 为 List、Set 或者数组,则表示其中的元素;若collection 为 map,则 item 代表 key-value 的 value,该参数为必选;
  • index 索引,index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历 list 的时候 index 就是索引,遍历 map 的时候 index 表示的就是 map 的 key,item 就是 map 的 Value。
  • open 表示该语句以什么开始,该参数为可选项(Mybatis 会将该字符拼接到整体的 sql 语句之前,并且只拼接一次);
  • separator 表示在每次进行迭代之间以什么符号作为分隔符;
  • close 表示以什么结束,该参数为可选项。

2. MyBatis<foreach>标签的使用

假设我们有一个 BatchDTO 的实体类:

java">import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Data
public class BatchDTO {private String workspaceKey;private String planId;private String baselineState;
}

2.1 批量插入

Repository 接口中定义方法:

java">boolean batchInsert(@Param("list") List<BatchDTO> batchDTOList, @Param("tableName") String tableName);

Mybatis 中 mapper.xml 实现如下:

java">    <insert id="batchInsert" parameterType="java.util.List">insert into ${tableName} (`workspace_key`, `plan_id`, baseline_state)values<foreach collection="list" item="item" separator=",">(#{item.workspaceKey}, #{item.planId}, #{item.baselineState})</foreach></insert>

2.2 批量编辑

Repository 接口中定义方法:

java">boolean batchUpdate(@Param("planIds") List<BatchDTO> batchDTOList, @Param("tableName") String tableName);

Mybatis 中 mapper.xml 实现如下:

java">    <update id="batchUpdate">update ${tableName}set `workspace_key` = "vvv"where `plan_id` in<foreach collection="planIds" item="item" index="index" open="(" separator="," close=")">#{item.planId}</foreach></update>

2.3 批量查询

Repository 接口中定义方法:

java">List<DAO> batchSelect(@Param("planIds") List<String> planIds, @Param("tableName") String tableName);

Mybatis 中 mapper.xml 实现如下:

java">    <select id="batchSelect" resultMap="DAOMap">select * from ${tableName}where 1 = 1<if test="planIds != null and planIds.size() > 0">and `plan_id` in<foreach collection="planIds" open="(" item="planId" close=")" separator=",">#{planId}</foreach></if></select>

如果入参类型是 List<String> 类型,可以直接以字符串类型作为入参,而不用传入一个 List。具体实现如下。

Repository 接口中定义方法:

java">List<DAO> batchSelect(@Param("planIds") String planIds, @Param("tableName") String tableName);

Mybatis 中 mapper.xml 实现如下:

java">    <select id="batchSelect" resultMap="PlanBaselineStateDAOMap">select * from ${tableName}where 1 = 1<if test="planIds != null and planIds != ''">and `plan_id` in<foreach collection="planIds.split(',')" open="(" item="planId" close=")" separator=",">#{planId}</foreach></if></select>

2.4 使用 foreach 遍历 map

这里举例使用 foreach 遍历 map。使用 foreach 遍历 map 时,foreach 标签中的参数 index 表示的就是 map 的 key,item 就是 map 的 Value。

Repository 接口中定义方法:

java">boolean batchInsert(@Param("batchInsertMap") Map<String, String> batchInsertMap, @Param("tableName") String tableName);

Mybatis 中 mapper.xml 实现如下:

java">    <insert id="batchInsert" parameterType="java.util.Map">insert into ${tableName} (`workspace_key`, `plan_id`)values<foreach collection="batchInsertMap" index="key" item="value" separator=",">(#{key}, #{value})</foreach></insert>

http://www.ppmy.cn/ops/10966.html

相关文章

Mybatisplus LambdaQueryWrapper表达式使用DATE_FORMAT比较日期函数

背景&#xff1a; 最近遇到一个问题&#xff0c;数据库保存的日期字段是如下格式 但是我们需要比较的日期为 2020-08-01格式&#xff0c; 所以我们要将日期格式化 使用 Mybatisplus LambdaQueryWrapper的情况下可用下面的方式做参考 LambdaQueryWrapper<SysDicCode> la…

java从零开始的较为平滑的学习流程

这篇文章非常适合以下人群&#xff1a; 初学者&#xff1a;对于刚开始学习 Java 的人来说&#xff0c;这个学习计划提供了一个清晰的起点&#xff0c;帮助大家逐步建立坚实的基础。 个人开发者&#xff1a;个人开发者可能会发现这个计划特别有用&#xff0c;因为它不仅涵盖了技…

服务器基础知识(1)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;服务器❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 1、什么是服务器 服务器是计算机的一种&#xff0c;它比普通计算机运行更快、负载更高、价格更贵。服务…

代码随想录算法训练营第三十八天 | 动态规划part01

题目&#xff1a; 斐波那契数爬楼梯使用最小花费爬楼梯 动态规划简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划有五个步骤&#xff1a; 确定dp数组以及下标的含义&…

b站江科大stm32笔记(持续更新)

b站江科大stm32笔记&#xff08;持续更新&#xff09; 片上资源/外设引脚定义表启动配置推挽开漏oc/od 门漏极/集电极 电阻的上拉下拉输入捕获输入捕获通道主从触发模式输入捕获基本结构PWMI基本结构PWMPSC ARR CRR输入捕获模式测频率TIM_PrescalerConfig()初始化输入捕获测频法…

刷题训练之二分查找

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握二分查找算法 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

部署后端常见问题:更换JDK版本

目录 #步骤一&#xff1a;创建相关目录用于安装JDK #步骤二&#xff1a;安装JDK17版本&#xff1a; 附&#xff1a; JDK8下载&#xff1a; JDK1.8下载&#xff1a; #步骤三&#xff1a;解压同时重命名文件&#xff1a; #步骤四&#xff1a;编辑文件设置环境变量 原本代…

ffmpeg截图(关键帧截图)

1.rtsp流截图 ffmpeg --stimeout 1000000 -rtsp_transport tcp -i rtsp://xxx -vf selecteq(pict_type,PICT_TYPE_I) -vsync vfr -ss 00:00:00.000 -vframes 1 -s 640x480 -y output.jpg -hide_banner参数解释&#xff1a; ● -stimeout 1000000&#xff1a;设置socket超时时间…