当前位置: 首页 > ops >正文

MyBatis 的 <foreach> 标签中collection 属性

目录

一、在普通Maven工程中

依赖版本如下:

StudentDao 接口中定义了 deleteBatch 方法:

在 StudentDao.xml 中添加以下动态 SQL 语句

二、在普通spring-boot工程中

依赖版本如下:

EmpMapper接口中定义了delete方法:

在 EmpMapper.xml 中添加以下动态 SQL 语句

Spring Boot中的简化

 三、总结


在 MyBatis 的 <foreach> 标签中,collection 属性用于指定要迭代的集合或数组。这个属性的值取决于传递给方法的参数类型以及参数的名称。

在使用SSM框架和spring-boot框架中不同点

一、在普通Maven工程中

依赖版本如下:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.17</version>
</dependency>

StudentDao 接口中定义了 deleteBatch 方法:

public interface StudentDao {int deleteBatch(List<String> ids);
}

在 StudentDao.xml 中添加以下动态 SQL 语句

<delete id="deleteBatch" parameterType="java.util.List">DELETE FROM studentsWHERE student_number IN<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
  1. 默认参数名称
    • 当方法参数是一个单一对象(如 List<String>)时,MyBatis 默认会将这个参数命名为 list。这是 MyBatis 的一个约定
      • 如果参数是一个 List,默认的参数名是 list
      • 如果参数是一个数组,默认的参数名是 array
      • 如果参数是一个单一对象(非集合或数组),默认的参数名是 _parameter
  2. 自定义参数名称
    • 如果你想使用自定义的参数名(如 ids),可以通过在方法参数前添加 @Param 注解来实现。例如:

      int deleteBatch(@Param("ids") List<String> ids);

      然后在 XML 中使用 collection="ids"

      <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}
      </foreach>

二、在普通spring-boot工程中

依赖版本如下:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version>
</dependency>

EmpMapper接口中定义了delete方法:

public interface EmpMapper {void delete(List<Integer> ids);
}

在 EmpMapper.xml 中添加以下动态 SQL 语句

<!--    批量 删除员工--><delete id="delete">delete from empwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>

Spring Boot中的简化

在Spring Boot工程中,你可以直接使用collection="ids"是因为:

  1. 通常我们会使用@Param注解明确指定参数名,这样MyBatis就能识别
  2. Spring Boot的自动配置和MyBatis的整合更紧密,对参数名的处理更灵活
  3. 使用Map或DTO对象封装参数时,可以自定义参数名

collection="ids"的情况

1.当你将List包装在一个Map或对象中,并指定参数名为"ids"时

Map<String, List<Integer>> params = new HashMap<>();
params.put("ids", Arrays.asList(1, 2, 3));
mapper.deleteByIds(params);

2.或者使用@Param注解:

@Delete("<script>" +"DELETE FROM table WHERE id IN " +"<foreach collection='ids' item='id' open='(' separator=',' close=')'>" +"#{id}" +"</foreach>" +"</script>")
void deleteByIds(@Param("ids") List<Integer> ids);

 三、总结

collection属性的值取决于你如何传递参数给MyBatis,使用@Param注解可以让你更自由地选择名称,而不需要依赖MyBatis的默认命名规则。

推荐使用@Param注解明确指定集合参数名,

  1. 如果不使用@Param注解,对于List参数,MyBatis默认使用"list"作为键;对于数组参数,默认使用"array"作为键

  2. 保持一致性,避免在同一个项目中混用不同的命名方式

http://www.xdnf.cn/news/10312.html

相关文章:

  • JVM学习(七)--JVM性能监控
  • WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?
  • 为什么badmin reconfig以后始终不能提交任务
  • PyTorch——DataLoader的使用
  • 第6节 Node.js 回调函数
  • iOS —— UI 初探
  • slider滑块async await
  • 使用BERT/BiLSTM + CRF 模型进行NER进展记录~
  • LangChain-结合GLM+SQL+函数调用实现数据库查询(三)
  • 机器学习算法-逻辑回归
  • AWS之数据分析
  • Spring Boot 中的 Web 应用与 Reactive Web 应用
  • 上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备
  • 性能优化 - 案例篇:缓存
  • Linux《文件系统》
  • 鸿蒙OS在UniApp中集成Three.js:打造跨平台3D可视化应用#三方框架 #Uniapp
  • 深入理解享元模式:用Java实现高效对象共享
  • LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++
  • 基于Android的跳蚤市场_springboot+vue
  • 【金融基础学习】债券回购方式
  • 鸿蒙OSUniApp开发跨平台AR扫描识别应用:HarmonyOS实践指南#三方框架 #Uniapp
  • 嵌入式硬件篇---蜂鸣器
  • 常见相机的ISP算法
  • 设计模式——观察者设计模式(行为型)
  • NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)
  • C#语音识别:使用Whisper.net实现语音识别
  • 从0开始学vue:Element Plus详解
  • 【算法应用】虚拟力算法VFA用于WSN覆盖,无人机网络覆盖问题
  • 《深度解构现代云原生微服务架构的七大支柱》
  • PyTorch ——torchvision数据集使用