@Param詳解

文章目錄

  • 背景
  • 什么是@Param
    • @Param的使用方法使用方法:
    • 遇到的問題及因
    • @Param解決了什么問題
    • 使用與不使用對比
  • @Param是如何進行映射的
  • 總結

背景

最近在開發過程中,在寫mapper接口是在參數前加了@Param注解,但是在運行的時候就會報錯,說是找不到參數、
nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘defaultRole’ not found. Available parameters are [role, param1]
在這里插入圖片描述

什么是@Param

@Param注解是一種用于標記方法參數的注解,它用于指定該參數的名稱和類型,在使用該參數時可以通過名稱來引用。在不同的編程語言和框架中,@Param注解的具體用法和功能可能會有所不同。

在Java開發中,如果用到了mybatis,那么@Param是用戶給方法參數指定一個名稱,以便在Mapper XML文件中引用該參數。

@Param的使用方法使用方法:

當使用MyBatis框架時,@Param注解有以下幾種使用方法:

1、在Mapper接口方法的參數前使用@Param注解指定參數名稱:

void insertUser(@Param("user") User user);

在Mapper XML文件中可以使用#{user}來引用參數。

2、在Mapper接口方法的參數前使用@Param注解指定多個參數名稱:

void insertUserAndRole(@Param("user") User user, @Param("role") Role role);

在Mapper XML文件中可以使用#{user}和#{role}來引用參數。

3、在Mapper接口方法的參數前使用@Param注解指定相同的參數名稱:

void insertUsers(@Param("users") List<User> users);

在Mapper XML文件中可以使用#{users}來引用參數。

4、在Mapper接口方法的參數前使用@Param注解指定多個相同的參數名稱:

void insertUserAndRoles(@Param("users") List<User> users, @Param("roles") List<Role> roles);

在Mapper XML文件中可以使用#{users}和#{roles}來引用參數。

5、在Mapper接口方法的參數前不使用@Param注解:

void insertUser(User user);

在Mapper XML文件中可以使用#{arg0}來引用參數,或者把#{arg0}替換為#{user}

6、在Mapper接口方法的參數前不使用@Param注解,但有多個參數:

void insertUserAndRole(User user, Role role);

在Mapper XML文件中可以使用#{arg0}和#{arg1}來引用參數。

這些是@Param注解的常見使用方法。通過使用@Param注解,可以明確指定Mapper接口方法參數的名稱,使得在Mapper XML文件中引用參數更加直觀和可讀。

原理:
@Param注解的作用是給Mapper接口方法的參數命名,以便在Mapper XML文件中引用這些參數。沒有@Param注解時,MyBatis無法識別參數的名稱,導致無法正確引用參數。
在編譯時,Java編譯器會將@Param注解保留在編譯后的字節碼文件中。MyBatis通過Java的反射機制獲取Mapper接口方法的參數列表,并檢查是否存在@Param注解。
當解析Mapper XML文件時,MyBatis會根據#{}占位符中的名稱來查找對應的參數。如果找不到與占位符名稱匹配的參數,MyBatis會拋出BindingException異常。

遇到的問題及因

這是我寫的mapper接口:

 int setDefaultRole( List<SysRole> roleList);

以及xml文件:

<update id="setDefaultRole" >update sys_role<set><foreach collection="roleList" item="role" separator=",">default_role=#{role.defaultRole},update_by=#{role.updateBy},update_time=sysdate()</foreach></set>where role_id in<foreach collection="roleList" item="role" open="(" close=")" separator=",">#{role.roleId}</foreach>and del_flag=0</update>

那么在xml文件中用到了多個關于roleList的多個參數,所以這里如果不使用@Param注解是不可以,他不能對應上對應的參數
這個錯誤通常是由于Mapper接口方法的參數和Mapper XML文件中的參數名不一致導致的。

@Param解決了什么問題

@Param注解主要解決了以下兩個問題:

解決多個參數的問題: 在Mapper接口方法中,如果存在多個參數,MyBatis默認會將這些參數封裝為一個Map對象,并以參數名作為鍵,參數值作為值。但是,當需要在Mapper XML文件中引用這些參數時,就需要使用#{}占位符,并指定對應的參數名。而@Param注解可以明確指定參數的名稱,使得在Mapper XML文件中引用參數更加直觀和可讀。

解決參數名與Mapper XML文件中占位符名稱不一致的問題: 在Mapper XML文件中,使用#{}占位符來引用參數,占位符中的名稱應該與Java代碼中的參數名稱一致。但是,Java編譯器在編譯時會將參數名擦除,導致在運行時無法獲取參數的名稱。而@Param注解可以保留參數的名稱,并在運行時通過反射機制獲取參數的名稱,從而確保參數名與占位符名稱一致。

通過使用@Param注解,可以提高Mapper接口方法的可讀性和可維護性,避免了潛在的錯誤。它確保了Mapper XML文件中的參數引用與Java代碼中的參數名稱一致。

使用與不使用對比

使用@Param注解和不使用的區別主要體現在Mapper接口方法的參數映射上。

不使用@Param注解:
void insertUser(User user);
在Mapper接口方法中,直接使用參數對象作為方法的參數,例如User user。在Mapper XML文件中,可以使用#{}占位符來引用參數的屬性,例如#{id}和#{name}。

使用@Param注解:
void insertUser(@Param(“user”) User user);
在Mapper接口方法中,使用@Param注解來明確指定參數的名稱,例如@Param(“user”)。在Mapper XML文件中,可以使用#{}占位符來引用參數,占位符中的名稱應與@Param注解中指定的名稱一致,例如#{user.id}和#{user.name}。

使用@Param注解的優勢是可以提高Mapper接口方法的可讀性和可維護性。通過明確指定參數的名稱,可以確保參數名與占位符名稱一致,避免因為參數順序變化或者重載方法導致的錯誤。

總結起來,使用@Param注解可以提高Mapper接口方法的可讀性和可維護性,確保參數名與占位符名稱一致,而不使用@Param注解則直接使用參數對象作為方法的參數。

@Param是如何進行映射的

當使用@Param注解時,MyBatis會通過反射機制獲取Mapper接口方法的參數信息,包括參數的名稱和類型。然后,MyBatis會將這些參數信息與方法的參數列表進行關聯,以便后續在Mapper XML文件中引用這些參數。

具體的映射過程如下:

在Mapper接口方法上使用@Param注解,并指定參數的名稱。例如:

void insertUser(@Param("user") User user);

這里使用@Param(“user”)注解明確指定了參數的名稱為"user"。

MyBatis解析Mapper接口方法時,會通過反射獲取方法的參數信息,包括參數的名稱和類型。這是通過Java的反射機制實現的。

在解析Mapper XML文件時,MyBatis會使用ParamNameResolver類來解析占位符中的參數名稱。ParamNameResolver會根據方法的參數列表和參數名稱,確定參數的映射關系。

在Mapper XML文件中,可以使用#{}占位符來引用參數。占位符中的名稱應與Java代碼中的參數名稱一致。例如:

<insert id="insertUser" parameterType="com.example.User">INSERT INTO user (id, name) VALUES (#{user.id}, #{user.name})
</insert>

這里使用#{user.id}和#{user.name}來引用參數。

通過以上過程,@Param注解實現了參數名稱與Mapper XML文件中占位符名稱的映射關系。這樣可以提高Mapper接口方法的可讀性和可維護性,確保參數名與占位符名稱一致。

總的來說,@Param注解的工作原理是通過反射機制獲取參數信息,并將參數名稱與方法的參數列表進行關聯,以確保參數名與占位符名稱一致。這樣可以提高Mapper接口方法的可讀性和可維護性。

總結

總結起來,@Param注解用于在Mapper接口方法中明確指定參數的名稱,以提高方法的可讀性和可維護性。以下是關于@Param注解的優缺點的總結:

優點:

明確參數名稱:使用@Param注解可以明確指定參數的名稱,避免參數順序變化或者重載方法導致的錯誤。這樣可以提高代碼的可讀性和可維護性。
參數與占位符一致:@Param注解可以確保參數名與Mapper XML文件中的占位符名稱一致,避免因為參數名與占位符不一致而引發的錯誤。
缺點:

冗余代碼:使用@Param注解會在Mapper接口方法中增加注解的代碼,可能會導致代碼的冗余。
額外的注解:使用@Param注解需要在Mapper接口方法中添加額外的注解,可能會增加代碼的復雜性。
@Param注解可以提高Mapper接口方法的可讀性和可維護性,確保參數名與占位符名稱一致。然而,使用@Param注解可能會導致代碼的冗余,同時也需要額外的注解。因此,在使用@Param注解時,需要根據具體情況進行權衡和取舍。

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

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

相關文章

關于游戲盾

游戲盾&#xff08;Game Shield&#xff09;是一種針對游戲行業特點的網絡安全解決方案&#xff0c;主要針對游戲平臺面臨的各種網絡攻擊和安全威脅。以下是一些原因&#xff0c;說明為什么游戲平臺需要加游戲盾&#xff1a; 1. DDoS攻擊&#xff1a;游戲平臺通常容易受到分布式…

深入理解多態:面向對象編程中的靈活性與擴展性

文章目錄 代碼學習-多態什么是多態&#xff1f;多態在代碼中的體現多態的優勢 代碼學習-多態 什么是多態&#xff1f; 多態是面向對象編程中的重要概念之一&#xff0c;它指的是為不同的數據類型的實體提供統一的接口。簡而言之&#xff0c;就是同一個命令在不同的對象上會產…

更多openEuler鏡像加入AWS Marketplace!

自2023年7月openEuler 22.03 LTS SP1正式登陸AWS Marketplace后&#xff0c;openEuler社區一直持續于在AWS上提供更多版本。 目前&#xff0c;openEuler22.03 LTS SP1 ,SP2兩個版本及 x86 arm64兩種架構的四個鏡像均可通過AWS對外提供&#xff0c;且在亞太及歐洲15個Region開放…

wkhtmltopdf 與 .Net Core

wkhtmltopdf 是使用webkit引擎轉化為pdf的開源小插件. 其有.NET CORE版本的組件,DinkToPdf,但該控件對跨平臺支持有限。 故打算在Linux上安裝相關插件直接調用. 準備工作 虛擬機&#xff1a;Linux version 3.10.0-1160.el7.x86_64 wkhtmltox開發包&#xff1a;wkhtmltox_0.12…

Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.MethodProxy

1. 異常信息 2023-08-16 14:17:14.817 INFO 14304 [ restartedMain] io.seata.config.ConfigurationFactory : load Configuration:FileConfiguration$$EnhancerByCGLIB$$862af1eb 2023-08-16 14:17:15.006 ERROR 14304 [ restartedMain] g.springframework.boot.Sprin…

大數據Flink(六十):Flink 數據流和分層 API介紹

文章目錄 Flink 數據流和分層 API介紹 一、??????????????Flink 數據流

ZooKeeper的應用場景(命名服務、分布式協調通知)

3 命名服務 命名服務(NameService)也是分布式系統中比較常見的一類場景&#xff0c;在《Java網絡高級編程》一書中提到&#xff0c;命名服務是分布式系統最基本的公共服務之一。在分布式系統中&#xff0c;被命名的實體通常可以是集群中的機器、提供的服務地址或遠程對象等一這…

iOS申請證書(.p12)和描述文件(.mobileprovision)

打包app時&#xff0c;經常會用到ios證書&#xff0c;但很多人都苦于沒有蘋果電腦&#xff0c;即使有蘋果電腦的&#xff0c;也會覺得蘋果電腦操作也很麻煩&#xff0c;這里記錄一下&#xff0c;用香蕉云編&#xff0c;申請證書及描述文件的過程。 香蕉云編的地址&#xff1a;…

【C語言】每日一題(多數元素)

多數元素&#xff0c;鏈接奉上 方法 1.摩爾投票2.合理但錯誤的方法2.1暴力循環2.2排序求出中間元素中間元素 1.摩爾投票 先來簡單的介紹摩爾投票&#xff1a; 摩爾投票是一種用來解決絕對眾數問題的算法。 什么是絕對眾數呢&#xff1f; 在一個集合中&#xff0c;如果一個元素…

[國產MCU]-BL602開發實例-SPI與WS2812B驅動

SPI與WS2812B驅動 文章目錄 SPI與WS2812B驅動1、BL602的SPI介紹2、SPI驅動API介紹3、WS2812B介紹4、WS2812B的SPI驅動實現串行外設接口(Serial Peripheral Interface Bus,SPI)是一種用于短程通信的同步串行通信接口規范,設備之間使用全雙工模式通信,是一個主機和一個或多個…

每天一練:SpringBoot連接mq

目錄 每天一練:Springboot連接rabbitmq 每天一練:Springboot連接rabbitmq 目錄一、部署Rabbitmq&#xff1f;二、增加maven依賴三、連接RabbitMq四、發布和訂閱消息總結 一、部署Rabbitmq&#xff1f; 這里rabbitmq采用docker安裝部署。 拉取docker鏡像 [root192 ~]# docker…

【ChatGLM】ChatGLM-6B模型Win+4GB顯卡本地部署筆記

ChatGLM-6B是清華大學知識工程和數據挖掘小組發布的一個類似ChatGPT的開源對話機器人&#xff0c;由于該模型是經過約1T標識符的中英文訓練&#xff0c;且大部分都是中文&#xff0c;因此十分適合國內使用。 預期環境 本機電腦備注&#xff1a; Win10專業版 32G內存256固態系統…

ChatGPT 調教日記(二):程序員轉量化的背景知識

程序員如何學習量化金融 作為一個程序員學習量化金融&#xff08;quant&#xff09;是一個不錯的選擇。以下是一些建議&#xff1a; 學習金融基礎知識&#xff1a;了解金融市場、投資策略和金融產品。這將幫助你理解量化金融的背景和應用場景。 學習統計學和數學&#xff1a;…

FlutterBoost 實現Flutter頁面內嵌iOS view

在使用Flutter混合開發中會遇到一些原生比Flutter優秀的控件&#xff0c;不想使用Flutter的控件&#xff0c;想在Flutter中使用原生控件。這時就會用到 Flutter頁面中內嵌 原生view&#xff0c;這里簡單介紹一個 內嵌 iOS 的view。 注&#xff1a;這里使用了 FlutterBoost。網…

SAP動態安全庫存簡介

動態安全庫存:跑需求計劃時,ERP系統按設置的庫存方式自動計算出滿足一定時間內可保障生產的庫存數量 SAP動態安全庫存的計算公式:動態安全庫存=平均日需求*覆蓋范圍。 平均日需求=特定時期內的總需求/特定時期內的工作天數 覆蓋范圍指在沒又貨物供應的情況下,庫存可以維…

稀疏感知圖像和體數據恢復的系統對象研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

STM32 F103C8T6學習筆記6:IIC通信__驅動MPU6050 6軸運動處理組件—一階互補濾波

今日主要學習一款傾角傳感器——MPU6050,往后對單片機原理基礎講的會比較少&#xff0c;更傾向于簡單粗暴地貼代碼&#xff0c;因為經過前些日子對MSP432的學習&#xff0c;對原理方面也有些熟絡了&#xff0c;除了在新接觸它時會對其引腳、時鐘、總線等進行仔細一些的研究之外…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目錄導讀 ATF(TF-A)安全通告匯總 目錄 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢復PMCR_EL0可能會泄露安全世界的時間信息 CVE ID CVE-2017-1503…

101.for循環語句練習題-求數列前n項的平方和

【目錄】 文章目錄 101.for循環語句練習題-求數列前n項的平方和1. 求數列前n項的平方和2. 冪函數3. f 字符串格式化語法4. 基礎代碼5. 自定義函數代碼6. 遞歸函數代碼7. 代碼總結 【正文】 101.for循環語句練習題-求數列前n項的平方和 1. 求數列前n項的平方和 【目標任務】 …

spark的standalone 分布式搭建

一、環境準備 集群環境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安裝 zookeeper 和 HDFS 1、啟動zookeeper -- 啟動zookeeper(11,12,13都需要啟動) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己寫的腳本-- 查看進程 jps -- 有…