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
英文地址,請注明出處:http://en.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…