Mybatis之mapper接口多參數(shù)方式
Mybatis mapper接口多參數(shù)
mybatis mapper接口類(lèi)可以通過(guò)五種方法接收多個(gè)參數(shù)
方法一:利用arg或param
利用arg或param獲取mapper接口類(lèi)的多參數(shù)
arg可以通過(guò)#{arg0}、#{arg1}、#{arg2}…獲取接口中相對(duì)應(yīng)的參數(shù)
param可以通過(guò)#{param1}、#{param2}、#{param3}…獲取接口中相對(duì)應(yīng)的參數(shù)。
方法二:map
通過(guò)把參數(shù) 以鍵值對(duì) 的方式存儲(chǔ)到map集合中,然后把map集合作為mapper接口類(lèi)的參數(shù),在mapper映射文件中編寫(xiě)SQL語(yǔ)句需要調(diào)用參數(shù)值時(shí),可以通過(guò)map集合的key調(diào)用。
public List<User> findUserMap(Map<String, Object> parameterMap);
<select id="findUserMap" parameterType="map" resultType="user">
<!-- concat:將多個(gè)字段連接起來(lái),組成新的字段 -->
select id,username from user where id=#{id} and username like concat('%',#{username},'%')
</select>方法三:通過(guò)Java Bean傳遞多個(gè)參數(shù)
通過(guò)把參數(shù)賦值給類(lèi)對(duì)象的變量,然后把類(lèi)對(duì)象作為mapper接口類(lèi)的參數(shù),在mapper映射文件中編寫(xiě)SQL語(yǔ)句需要調(diào)用參數(shù)值時(shí),可以通過(guò)類(lèi)對(duì)象的變量名調(diào)用。
方法四:@Param()
通過(guò) @Param() 注解給參數(shù)加上key,在mapper映射文件中就可以通過(guò)key,所謂的key也就是@Param內(nèi)value中的值。
//mapper多參數(shù)傳入
User findUserOne(@Param(value = "username") String username, @Param("password") String password);方法五:混合使用
在某些情況下可能需要混合使用幾種方法來(lái)傳遞參數(shù)。
舉個(gè)例子:
查詢一個(gè)角色,可以通過(guò)角色名稱和備注進(jìn)行查詢,與此同時(shí)還需要支持分頁(yè)
public List<Role> findByMix(@Param("params") RoleParams roleParams, @Param("page") PageParam PageParam);<select id="findByMix" resultType="role">
select id, role_name as roleName, note from t_role
where role_name like concat('%', #{params.roleName}, '%')
and note like concat('%', #{params.note}, '%')
limit #{page.start}, #{page.limit}
</select>解析

當(dāng)只傳一個(gè)參數(shù)時(shí),不需要@Param注解標(biāo)注key,可以省略
注意
- 使用 map 傳遞參數(shù)導(dǎo)致了業(yè)務(wù)可讀性的喪失,導(dǎo)致后續(xù)擴(kuò)展和維護(hù)的困難,在實(shí)際的應(yīng)用中要果斷廢棄這種方式。
- 使用 @Param 注解傳遞多個(gè)參數(shù),受到參數(shù)個(gè)數(shù)(n)的影響。當(dāng) n≤5 時(shí),這是最佳的傳參方式,它比用 Java Bean 更好,因?yàn)樗又庇^;當(dāng) n>5 時(shí),多個(gè)參數(shù)將給調(diào)用帶來(lái)困難,此時(shí)不推薦使用它。
- 當(dāng)參數(shù)個(gè)數(shù)多于5個(gè)時(shí),建議使用 Java Bean 方式。
- 對(duì)于使用混合參數(shù)的,要明確參數(shù)的合理性。
Mybatis mapper方法中綁定多個(gè)參數(shù)異常
1.mybatis mapper方法中綁定多個(gè)參數(shù)異常
問(wèn)題如圖所示:

代碼:
Integer selectByWriteOffStatus(@RequestParam ("id") String id, @RequestParam("mobileNo") String mobileNo, @RequestParam("writeOffStatus") String writeOffStatus);錯(cuò)誤原因分析:
沒(méi)有加@Param注解,Mapper中的參數(shù)和xml中sql語(yǔ)句的參數(shù)沒(méi)有對(duì)應(yīng)起來(lái),所以會(huì)出現(xiàn)參數(shù)未找到的情況,導(dǎo)致執(zhí)行sql時(shí)無(wú)法辨識(shí)id字段
上圖使用注解不對(duì),應(yīng)該改為@Param
擴(kuò)展:
2.@requestParam與@Param區(qū)別:
1.@RequestParam 用于controller層,是Spring的注解
標(biāo)注在Controller層方法的參數(shù)上,用來(lái)解決前端與后端參數(shù)不一致的問(wèn)題。@RequestParam將請(qǐng)求參數(shù)和控制器方法的形參創(chuàng)建映射關(guān)系。
2.@Param 用于dao層,是mybatis中的注解
該注解標(biāo)注在dao接口中的方法參數(shù)上,用來(lái)簡(jiǎn)化xml配置的時(shí)候(比如Mybatis的Mapper.xml中的sql參數(shù)注入),@Param注解的作用是給參數(shù)命名,參數(shù)命名后就可以通過(guò) #{xxx} 的形式注入sql語(yǔ)句中(xxx為@Param給參數(shù)設(shè)置的名稱)。@Param注解是為了dao接口的方法參數(shù)和配置文件sql語(yǔ)句的參數(shù)保持變量名的一致性。
在mapper中如何傳遞多個(gè)參數(shù)
方法1:順序傳參法
public User selectUser(String name, int deptId);
<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{0} and dept_id = #{1}
</select>#{}里面的數(shù)字代表傳入?yún)?shù)的順序。
方法2:@Param注解傳參法
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);<select id="selectUser" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>#{}里面的名稱對(duì)應(yīng)的是注解@Param括號(hào)里面修飾的名稱。
方法3:Map傳參法
public User selectUser(Map<String, Object> params);
<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>#{}里面的名稱對(duì)應(yīng)的是Map里面的key名稱。
方法4:Java Bean傳參法
public User selectUser(User user);
<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">
select * from user
where user_name = #{userName} and dept_id = #{deptId}
</select>#{}里面的名稱對(duì)應(yīng)的是User類(lèi)里面的成員屬性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 自定義注解實(shí)現(xiàn)Spring容器注入Bean方式(類(lèi)似于mybatis的@MapperScans)
- 修改SpringBoot 中MyBatis的mapper.xml文件位置的過(guò)程詳解
- Mybatis報(bào)Type interface *.*Mapper is not known to the MapperRegis
- springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題
- idea使用mybatis插件mapper中的方法爆紅的解決方案
- Mybatis不啟動(dòng)項(xiàng)目直接測(cè)試Mapper的實(shí)現(xiàn)方法
相關(guān)文章
FeignClient中name和url屬性的作用說(shuō)明
這篇文章主要介紹了FeignClient中name和url屬性的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringSecurity?用戶帳號(hào)已被鎖定的問(wèn)題及解決方法
這篇文章主要介紹了SpringSecurity?用戶帳號(hào)已被鎖定,本文給大家分享問(wèn)題原因及解決方式,需要的朋友可以參考下2023-12-12
快速入門(mén)介紹Java中強(qiáng)大的String.format()
這篇文章主要給大家介紹了如何快速入門(mén)介紹Java中強(qiáng)大的String.format()的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁(yè)數(shù)據(jù)查詢的過(guò)程詳解
這篇文章主要給大家介紹了關(guān)于利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁(yè)數(shù)據(jù)查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
java排查一個(gè)線上死循環(huán)cpu暴漲的過(guò)程分析
這篇文章主要介紹了java排查一個(gè)線上死循環(huán)cpu暴漲的過(guò)程分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Spring主配置文件(applicationContext.xml) 導(dǎo)入約束詳解
在本篇文章里我們給各位整理的是關(guān)于Spring主配置文件(applicationContext.xml) 導(dǎo)入約束的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要參考下。2019-08-08

