Java 集合与 MyBatis 动态 SQL 实战教程


一、Java 集合的创建与用法

在 Java 中,ListHashSet 和数组是常用的集合类型,以下是它们的创建与基本操作:

1. List 列表

创建方式

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));  // 可变列表
List<Integer> immutableList = List.of(1, 2, 3);                // 不可变列表(Java 9+)

常用方法

list.add(4);          // 添加元素
list.remove(2);       // 删除索引为2的元素
list.get(0);          // 获取第一个元素
list.contains(3);     // 判断是否包含元素3
2. HashSet 集合

创建方式

Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));  // 无序、不重复集合

常用方法

set.add(4);           // 添加元素(若存在则忽略)
set.remove(2);        // 删除元素2
set.contains(3);      // 判断是否包含元素3
3. Integer 数组

创建方式

Integer[] array = {1, 2, 3};                            // 直接初始化
Integer[] array2 = new Integer[3];                     // 声明长度为3的空数组
array2[0] = 1; array2[1] = 2; array2[2] = 3;           // 赋值

遍历方式

for (int num : array) {System.out.println(num);
}

二、MyBatis 中集合参数的处理

MyBatis 的 <foreach> 标签用于遍历集合生成动态 SQL,但不同集合类型需配置不同的 collection 属性。

1. 参数为 List

Mapper 接口方法

List<Emp> findByIds(List<Integer> ids);

XML 配置

<foreach collection="list" item="id" ...>  <!-- 必须用 list -->

原因
MyBatis 默认将 List 类型参数命名为 list,因此 collection="list"


2. 参数为 Collection(如 HashSet)

Mapper 接口方法

List<Emp> findByIds2(Set<Integer> ids);  // 或 Collection<Integer> ids

XML 配置

<foreach collection="collection" item="id" ...>  <!-- 必须用 collection -->

原因
MyBatis 将非 ListCollection 类型(如 Set)统一命名为 collection


3. 参数为数组

Mapper 接口方法

List<Emp> findByIds3(Integer[] ids);

XML 配置

<foreach collection="array" item="id" ...>  <!-- 必须用 array -->

原因
MyBatis 将数组类型参数命名为 array


三、测试代码解析

用户提供的测试类 demo02.java 展示了不同集合参数的传递方式:

// 测试 List 参数
@Test
public void testFindByIds() {List<Integer> ids = Arrays.asList(1, 2, 3);mapper.findByIds(ids).forEach(System.out::println);  // 调用 list 方法
}// 测试 HashSet 参数
@Test
public void testFindByIds2() {Set<Integer> ids = new HashSet<>(Arrays.asList(1, 2, 3));mapper.findByIds2(ids).forEach(System.out::println);  // 调用 collection 方法
}// 测试数组参数
@Test
public void testFindByIds3() {Integer[] ids = {1, 2, 3};mapper.findByIds3(ids).forEach(System.out::println);  // 调用 array 方法
}

四、常见问题与解决方案
1. 如何自定义集合参数名称?

若想使用自定义名称(如 ids),需通过 @Param 注解显式指定:

List<Emp> findByIds(@Param("ids") List<Integer> ids);

XML 中改为:

<foreach collection="ids" item="id" ...>
2. 混合参数如何处理?

当方法有多个参数时,需为集合参数添加 @Param

List<Emp> findByIdsAndName(@Param("ids") List<Integer> ids,@Param("name") String name
);

XML 中使用 idsname

<if test="name != null"> AND name = #{name} </if>
<foreach collection="ids" item="id" ...>
3. 集合为空时的处理

为避免 SQL 语法错误,需在 <foreach> 外层添加判空条件:

<if test="ids != null and !ids.isEmpty()">id IN<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</if>

五、总结
集合类型Java 创建方式MyBatis 的 collection 属性
ListArrays.asList(1, 2, 3)list
HashSetnew HashSet<>(Arrays.asList(...))collection
数组Integer[] ids = {1, 2, 3}array

关键点

  • MyBatis 默认对 ListCollection、数组使用固定名称 listcollectionarray
  • 使用 @Param 可自定义参数名称,增强可读性。
  • 始终检查集合是否为空,避免动态 SQL 拼接错误。

通过掌握这些规则,可以高效处理 MyBatis 中的集合参数,实现灵活的动态查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/80883.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/80883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机避障——(运动规划部分)深蓝学院动力学kinodynamic A* 3D算法理论解读(附C++代码)

开源代码链接&#xff1a;GitHub - Perishell/motion-planning 效果展示&#xff1a; ROS 节点展示全局规划和轨迹生成部分&#xff1a; Kinodynamic A*代码主体&#xff1a; int KinoAstar::search(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel,Eigen::Vector3d en…

Transformer Decoder-Only 算力FLOPs估计

FLOPs和FLOPS的区别 FLOPs &#xff08;Floating Point Operations&#xff09;是指模型或算法执行过程中总的浮点运算次数&#xff0c;单位是“次”FLOPS &#xff08;Floating Point Operations Per Second&#xff09;是指硬件设备&#xff08;如 GPU 或 CPU&#xff09;每…

掌握MySQL数据库操作:从创建到管理全攻略

1.库的操作 1.1库的查看 show databases; 这句语法形式是查看服务器已经存在的数据库 注意要加分号————&#xff1b; 1.databeses是复数形式 2.大小写都可以 前提&#xff08;数据库已经创建或查看服务器自带的数据库&#xff09; 也可以查看指定的数据库 show cre…

服务器综合实验(实战详解)

实验内容 环境拓扑结构 主机环境描述 主机名主机地址需要提供的服务content.exam.com172.25.250.101提供基于httpd/nginx的YUM仓库服务ntp.exam.com172.25.250.102提供基于Chronyd的NTP服务mysql.exam.com172.25.250.103提供基于MYSQL的数据库服务nfs.exam.com172.25.250.104…

CentOS 7 修改锁屏时间为永不

在 CentOS 7 中&#xff0c;默认情况下&#xff0c;系统会在一定时间不活动后自动锁屏。对于某些用户来说&#xff0c;可能希望禁用自动锁屏功能或者将锁屏时间设置为“永不”。本文将介绍如何通过图形界面和命令行两种方式修改 CentOS 7 的锁屏时间&#xff0c;确保系统永不自…

MySQL 日期计算方法 date_sub()、date_add()、datediff() 详解-文中有示例帮助理解

1、date_sub()、date_add() date_sub() 和date_add() 语法相同&#xff0c;只不过一个加一个减。 从日期中减去指定时间间隔 语法&#xff1a; DATE_SUB(start_date, INTERVAL expr unit) start_date: 起始日期&#xff08;如 now() , 字段名&#xff09;。 INTERVAL expr…

宝塔基于亚马逊云服务器安装mysql5.7失败问题记录

安装日志如下&#xff1a; --2025-05-14 15:25:15-- https://na1-node.bt.cn/install/1/mysql.sh Resolving na1-node.bt.cn (na1-node.bt.cn)... 128.1.164.196 Connecting to na1-node.bt.cn (na1-node.bt.cn)|128.1.164.196|:443... connected. HTTP request sent, awaitin…

LLaMA-Factory 微调 Qwen2-7B-Instruct

一、系统环境 使用的 autoDL 算力平台 1、下载基座模型 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com # &#xff08;可选&#xff09;配置 hf 国内镜像站huggingface-cli download --resume-download shenzhi-wang/Llama3-8B-Chinese-Chat -…

Redis三种高可用模式的使用场景及特点的详细介绍

Redis三种高可用模式的使用场景及特点的详细介绍&#xff0c;结合不同业务需求提供选择建议&#xff1a; 主从模式&#xff08;Replication&#xff09; 核心能力&#xff1a;数据冗余备份、读写分离 适用场景&#xff1a; 读多写少&#xff1a;例如内容发布平台、新闻网站等…

通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?

实验开始前&#xff0c;先搞懂为什么要部署该集群&#xff1f; 这个方案的目标是让网站 永不宕机&#xff0c;即使某台服务器挂了&#xff0c;用户也感觉不到。它主要涉及 负载均衡&#xff08;LVS&#xff09; 高可用&#xff08;Keepalived&#xff09; 共享存储&#xff…

Qt中解决UI线程阻塞导致弹窗无法显示的两种方法

在Qt应用程序开发中,我们经常会遇到这样的问题:当执行一个耗时操作时,整个界面会卡住,无法响应任何用户操作,甚至连一个简单的提示弹窗都无法正常显示。本文将介绍两种解决这个问题的方法,并通过完整的代码示例进行说明。 问题描述 先来看一个常见的错误示例: #inclu…

2025年中国DevOps工具选型指南:主流平台能力横向对比

在数字化转型纵深发展的2025年&#xff0c;中国企业的DevOps工具选型呈现多元化态势。本文从技术架构、合规适配、生态整合三个维度&#xff0c;对Gitee、阿里云效&#xff08;云效DevOps&#xff09;、GitLab CE&#xff08;中国版&#xff09;三大主流平台进行客观对比分析&a…

isp流程介绍(yuv格式阶段)

一、前言介绍 前面两章里面&#xff0c;已经分别讲解了在Raw和Rgb域里面&#xff0c;ISP的相关算法流程&#xff0c;从前面文章里面可以看到&#xff0c;在Raw和Rgb域里面&#xff0c;很多ISP算法操作&#xff0c;更像是属于sensor矫正或者说sensor标定操作。本质上来说&#x…

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框

虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框1. 退出编辑器时弹出的“Save Content”窗口2. File 菜单中的保存选项3. 区别总结 1. 退出编辑器时弹出的“Save Content”窗口 退出时…

如何判断IP是否被平台标记

一、基础检测&#xff1a;连通性与黑名单筛查 网络连通性测试 Ping与Traceroute&#xff1a;通过命令测试延迟和路由路径&#xff0c;若延迟>50ms或存在异常节点&#xff08;如某跳延迟>200ms&#xff09;&#xff0c;可能影响可用性。示例命令&#xff1a; bash ping 8.…

零Gas授权实战:用线下签名玩转智能合约 Permit 机制

目录 链下签名背景什么是 Permit ?链下签名应用场景Permit 原理简述实战:从合约到前端完整实现安全注意事项总结链下签名背景 在以太坊智能合约开发中,很多初学者经常面临这样一个问题:ERC20 代币授权必须先调用链上合约的 approve(),再调用链上合约的 transferFrom(),每…

React 简介:核心概念、组件化架构与声明式编程

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…

LeetCode100.7 接雨水

对于这题&#xff0c;有一个非常直观简洁的思路&#xff1a;水量等于柱子围成的体积减去柱子的体积。 首先计算每一个高度的体积&#xff0c;相加即为总体积&#xff0c;减去sum(height)即为水的体积。 class Solution { public:int trap(vector<int>& height) {in…

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…

Go 语言 sqlx 库使用:对 MySQL 增删改查

MySQL 作为目前最流行的开源关系型数据库&#xff0c;其 SQL 语法体系已形成行业标准&#xff0c;相关知识体系庞大且成熟&#xff0c;本文不再对 SQL 基础进行详细展开&#xff0c;建议尚未掌握的读者先行系统学习。本文聚焦于如何使用 Go 语言进行 MySQL 数据库操作&#xff…