MyBatis @Param 注解詳解:多參數傳遞與正確使用方式

@Param 注解主要用于 MyBatis 進行參數傳遞時給 SQL 語句中的參數 起別名,通常用于 多參數 方法,使參數在 XML Mapper 文件或注解 SQL 語句中更清晰易用。


1. 基本用法

@Mapper 接口中使用 @Param 來為參數命名,避免 MyBatis 解析時出現參數名丟失的問題(尤其是多個參數時)。

示例:查詢用戶

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{userId}")User findUserById(@Param("userId") Long id);
}

解釋

  • @Param("userId") 給方法參數 id 取別名 userId
  • SQL 語句 #{userId} 通過 MyBatis 解析參數值。

2. 多參數使用 @Param

如果方法有 多個參數,MyBatis 默認無法識別參數名,必須使用 @Param 指定。

示例:根據用戶名和郵箱查詢用戶

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND email = #{email}")User findByUsernameAndEmail(@Param("username") String username, @Param("email") String email);
}

相當于 SQL

SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';

3. @Param 在 XML 中使用

如果使用 XML 方式編寫 SQL,同樣需要 @Param 進行參數映射。

示例:XML 配置

Mapper 接口

@Mapper
public interface UserMapper {User findUserByName(@Param("name") String name);
}

UserMapper.xml

<select id="findUserByName" parameterType="string" resultType="User">SELECT * FROM users WHERE username = #{name}
</select>

#{name} 對應 @Param("name"),MyBatis 能正確解析參數。


4. 適用于 INSERTUPDATEDELETE

示例:更新用戶信息

@Update("UPDATE users SET email = #{email} WHERE username = #{username}")
void updateUserEmail(@Param("username") String username, @Param("email") String email);

調用:

userMapper.updateUserEmail("Tom", "newemail@example.com");

執行的 SQL:

UPDATE users SET email = 'newemail@example.com' WHERE username = 'Tom';

5. 適用于 IN 查詢(列表參數)

如果 SQL 需要 IN 語句,@Param 也可以用于傳遞 List

示例:批量查詢用戶

@Select("<script>SELECT * FROM users WHERE id IN " +"<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +"</script>")
List<User> findUsersByIds(@Param("ids") List<Long> ids);

調用:

List<Long> userIds = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.findUsersByIds(userIds);

執行的 SQL:

SELECT * FROM users WHERE id IN (1, 2, 3);

6. 適用于 Map 作為參數

如果方法參數是 Map@Param 可以簡化參數獲取。

示例:傳遞 Map 查詢

@Select("SELECT * FROM users WHERE username = #{param.username} AND email = #{param.email}")
User findByMap(@Param("param") Map<String, Object> param);

調用:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "Tom");
paramMap.put("email", "tom@example.com");User user = userMapper.findByMap(paramMap);

執行的 SQL:

SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';

7. 適用于對象參數(拆分對象字段)

如果參數是對象,可以直接使用 #{對象.字段} 訪問屬性,但 @Param 仍然可用于 明確參數名稱

示例:傳遞 User 對象

@Insert("INSERT INTO users(username, email) VALUES(#{user.username}, #{user.email})")
void insertUser(@Param("user") User user);

調用:

User user = new User("Alice", "alice@example.com");
userMapper.insertUser(user);

執行的 SQL:

INSERT INTO users(username, email) VALUES('Alice', 'alice@example.com');

總結

用法示例適用場景
單個參數@Param("userId") Long id傳遞單個參數,避免 SQL 中參數混亂
多個參數@Param("username") String name, @Param("email") String email傳遞多個參數,保證 SQL 解析正確
XML 方式#{name} 對應 @Param("name")XML 中映射參數
列表參數@Param("ids") List<Long> idsIN 查詢
Map 參數@Param("param") Map<String, Object>傳遞多個參數,簡化方法參數列表
對象參數@Param("user") User user直接使用對象字段

什么時候必須用 @Param

? 必須用 @Param 的情況

  1. 多個參數,否則 MyBatis 可能無法正確解析
  2. SQL 中參數命名和方法參數不同
  3. XML 方式,參數需要手動映射
  4. List/Map 參數,用于 IN 查詢或動態 SQL

? 不需要 @Param 的情況

  • 只有 一個參數 時,可以直接使用 #{參數名}
  • 參數是 對象,可以直接 #{對象.字段} 訪問

💡 總結
@Param 主要用于 多參數方法,保證 MyBatis 正確解析 SQL 參數,提高可讀性和維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71603.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenBMC:BmcWeb connect讀取http請求

OpenBMC:BmcWeb構造connect對象-CSDN博客 OpenBMC:BmcWeb server.run-CSDN博客 1.構造了connect對象后,通過connection->start()開始處理來自客戶端的請求 //http\http_connection.hpp void start() {...startDeadline();readClientIp();boost::beast::async_detect_ssl…

SparkStreaming之04:調優

SparkStreaming調優 一 、要點 4.1 SparkStreaming運行原理 深入理解 4.2 調優策略 4.2.1 調整BlockReceiver的數量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…

軟考初級程序員知識點匯總

以下是計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試&#xff08;簡稱“軟考”&#xff09;中 程序員&#xff08;初級&#xff09; 考試的核心知識點匯總&#xff0c;涵蓋考試大綱的主要方向&#xff0c;幫助你系統復習&#xff1a; 一、計算機基礎 計算機組…

Gauss數據庫omm用戶無法連接處理

確保gauss數據庫服務已經打開 重啟gauss服務 gs_om -t restart 連接gauss gsql -d postgres -p 26000 -r 結果發現 查看數據庫運行情況 gs_om -t status --detail 我們可以看到 cluster_state 的值是 Unavailable 不可用 那么問題大概率是出現在了這里 然后我們再查看一…

36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist

增對wifi的調試命令有很多,這邊列出我們常用的命令提供參考,方便查看信息定位問題。 1、iwconfig 查看當前 WIFI 的工作信道以及工作帶寬模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…

Android 低功率藍牙之BluetoothGattDescriptor詳解

BluetoothGattDescriptor 詳解 BluetoothGattDescriptor 是 Android 中用于表示藍牙低功耗&#xff08;BLE&#xff09;設備中 GATT&#xff08;Generic Attribute Profile&#xff09;描述符 的類。描述符是 GATT 架構中的一種屬性&#xff0c;用于提供關于 特征值&#xff0…

計算機畢業設計Python+DeepSeek-R1大模型醫療問答系統 知識圖譜健康膳食推薦系統 食譜推薦系統 醫療大數據(源碼+LW文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

數字體驗推薦TOP8提升用戶參與

數字內容體驗推薦核心優勢 在數字化競爭日益激烈的市場環境中&#xff0c;數字內容體驗的差異化優勢已成為企業突圍的關鍵。通過智能算法驅動的個性化推薦系統&#xff0c;能夠精準捕捉用戶行為軌跡與興趣偏好&#xff0c;實現內容與受眾的動態匹配。這種技術不僅顯著提升頁面…

【每日學點HarmonyOS Next知識】動圖循環播放、監聽tab切換、富文本上下滾動、tab默認居中、a標簽喚起撥號

1、image加載網絡動圖播放一遍后不再播放,有什么方法可以 設置循環播放 目前ArkUI不支持gif圖片設置輪播次數&#xff0c;可通過三方庫ohos-gif-drawable設置輪播次數&#xff0c;在播放一次結束后的回調方法getLoopFinish()中更新播放次數&#xff0c;達到指定次數后設置播放…

redis數據遷移教程(使用RedisShake實現不停機遷移十分便捷)

1.我的場景 需要把本地的redis數據上傳到阿里云服務器上面,服務器上redis并沒有開aof持久化,但是將rdb文件上傳至服務器后每次重啟redis,rdb文件會被覆蓋導致無法同同步數據,最終決定使用RedisShake 2.RedisShake介紹 什么是 RedisShake? RedisShake 是一個用于處理和遷移…

C語言_數據結構總結4:不帶頭結點的單鏈表

純C語言代碼&#xff0c;不涉及C 0. 結點結構 typedef int ElemType; typedef struct LNode { ElemType data; //數據域 struct LNode* next; //指針域 }LNode, * LinkList; 1. 初始化 不帶頭結點的初始化&#xff0c;即只需將頭指針初始化為NULL即可 void Init…

78.StringBuilder簡單示例 C#例子 WPF例子

利用 StringBuilder 提升字符串操作性能 在 C# 中&#xff0c;字符串是不可變的&#xff0c;這意味著每次修改字符串時都會創建一個新的對象。這種特性雖然保證了安全性&#xff0c;但在頻繁修改字符串的場景中會導致性能問題。StringBuilder 正是為解決這一問題而設計的。 什…

【數據集】社區天氣資訊網絡CoWIN-香港小時尺度氣象數據(含MATLAB處理代碼)

社區天氣資訊網絡CoWIN-香港小時尺度氣象數據 數據概述氣象變量說明數據提取(MATLAB全代碼)輸出WRF所需站點氣溫數據參考數據概述 官網-Community Weather Information Network (CoWIN) data policy CoWIN 提供 2010 - 2024 年 的數據下載,每年數據均可單獨下載。下載數據…

【JAVA架構師成長之路】【Redis】第14集:Redis緩存穿透原理、規避、解決方案

30分鐘自學教程&#xff1a;Redis緩存穿透原理與解決方案 目標 理解緩存穿透的成因及危害。掌握布隆過濾器、空值緩存等核心防御技術。能夠通過代碼實現請求攔截與緩存保護。學會限流降級、異步加載等應急方案。 教程內容 0~2分鐘&#xff1a;緩存穿透的定義與核心原因 定義…

尚硅谷爬蟲note15

一、當當網 1. 保存數據 數據交給pipelines保存 items中的類名&#xff1a; DemoNddwItem class DemoNddwItem(scrapy.Item): 變量名 類名&#xff08;&#xff09; book DemoNddwItem(src src, name name, price price)導入&#xff1a; from 項目名.items import 類…

LVGL直接解碼png圖片的方法

通過把png文件解碼為.C文件&#xff0c;再放到工程中的供使用&#xff0c;這種方式隨時速度快&#xff08;應為已經解碼&#xff0c;代碼中只要直接加載圖片數據顯示出來即可&#xff09;&#xff0c;但是不夠靈活&#xff0c;適用于哪些簡單又不經常需要更換UI的場景下使用。如…

【計算機網絡】Socket

Socket 是網絡通信的核心技術之一&#xff0c;充當應用程序與網絡協議棧之間的接口。 1. Socket 定義 Socket&#xff08;套接字&#xff09;是操作系統提供的 網絡通信抽象層&#xff0c;允許應用程序通過標準接口&#xff08;如 TCP/IP 或 UDP&#xff09;進行數據傳輸。它…

Apache XTable:在數據湖倉一體中推進數據互作性

Apache XTable 通過以多種開放表格式提供對數據的訪問&#xff0c;在增強互作性方面邁出了一大步。移動數據很困難&#xff0c;在過去&#xff0c;這意味著在為數據湖倉一體選擇開放表格式時&#xff0c;您被鎖定在該選擇中。一個令人興奮的項目當在數據堆棧的這一層引入互作性…

anolis8.9-k8s1.32-node-二進制部署

一、系統 # cat /etc/anolis-release Anolis OS release 8.9 # uname -r 5.10.134-18.an8.x86_64 二、從master上拷貝dockers及cri-docker相關文件 # groupadd docker # mkdir /etc/docker# scp -P 4033 root192.168.7.201:/etc/systemd/system/containerd.service /etc/s…

《AJAX:前端異步交互的魔法指南》

什么是AJAX AJAX&#xff08;Asynchronous JavaScript and XML&#xff0c;異步 JavaScript 和 XML&#xff09; 是一種用于創建異步網頁應用的技術&#xff0c;允許網頁在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并局部更新頁面內容。盡管名稱中包含 XML&…