Mybatis之mapper接口多參數(shù)方式
Mybatis mapper接口多參數(shù)
mybatis mapper接口類可以通過五種方法接收多個(gè)參數(shù)
方法一:利用arg或param
利用arg或param獲取mapper接口類的多參數(shù)
arg可以通過#{arg0}、#{arg1}、#{arg2}…獲取接口中相對應(yīng)的參數(shù)
param可以通過#{param1}、#{param2}、#{param3}…獲取接口中相對應(yīng)的參數(shù)。
方法二:map
通過把參數(shù) 以鍵值對 的方式存儲(chǔ)到map集合中,然后把map集合作為mapper接口類的參數(shù),在mapper映射文件中編寫SQL語句需要調(diào)用參數(shù)值時(shí),可以通過map集合的key調(diào)用。
public List<User> findUserMap(Map<String, Object> parameterMap);
<select id="findUserMap" parameterType="map" resultType="user"> <!-- concat:將多個(gè)字段連接起來,組成新的字段 --> select id,username from user where id=#{id} and username like concat('%',#{username},'%') </select>
方法三:通過Java Bean傳遞多個(gè)參數(shù)
通過把參數(shù)賦值給類對象的變量,然后把類對象作為mapper接口類的參數(shù),在mapper映射文件中編寫SQL語句需要調(diào)用參數(shù)值時(shí),可以通過類對象的變量名調(diào)用。
方法四:@Param()
通過 @Param() 注解給參數(shù)加上key,在mapper映射文件中就可以通過key,所謂的key也就是@Param內(nèi)value中的值。
//mapper多參數(shù)傳入 User findUserOne(@Param(value = "username") String username, @Param("password") String password);
方法五:混合使用
在某些情況下可能需要混合使用幾種方法來傳遞參數(shù)。
舉個(gè)例子:
查詢一個(gè)角色,可以通過角色名稱和備注進(jìn)行查詢,與此同時(shí)還需要支持分頁
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)用帶來困難,此時(shí)不推薦使用它。
- 當(dāng)參數(shù)個(gè)數(shù)多于5個(gè)時(shí),建議使用 Java Bean 方式。
- 對于使用混合參數(shù)的,要明確參數(shù)的合理性。
Mybatis mapper方法中綁定多個(gè)參數(shù)異常
1.mybatis mapper方法中綁定多個(gè)參數(shù)異常
問題如圖所示:
代碼:
Integer selectByWriteOffStatus(@RequestParam ("id") String id, @RequestParam("mobileNo") String mobileNo, @RequestParam("writeOffStatus") String writeOffStatus);
錯(cuò)誤原因分析:
沒有加@Param注解,Mapper中的參數(shù)和xml中sql語句的參數(shù)沒有對應(yīng)起來,所以會(huì)出現(xiàn)參數(shù)未找到的情況,導(dǎo)致執(zhí)行sql時(shí)無法辨識(shí)id字段
上圖使用注解不對,應(yīng)該改為@Param
擴(kuò)展:
2.@requestParam與@Param區(qū)別:
1.@RequestParam 用于controller層,是Spring的注解
標(biāo)注在Controller層方法的參數(shù)上,用來解決前端與后端參數(shù)不一致的問題。@RequestParam將請求參數(shù)和控制器方法的形參創(chuàng)建映射關(guān)系。
2.@Param 用于dao層,是mybatis中的注解
該注解標(biāo)注在dao接口中的方法參數(shù)上,用來簡化xml配置的時(shí)候(比如Mybatis的Mapper.xml中的sql參數(shù)注入),@Param注解的作用是給參數(shù)命名,參數(shù)命名后就可以通過 #{xxx} 的形式注入sql語句中(xxx為@Param給參數(shù)設(shè)置的名稱)。@Param注解是為了dao接口的方法參數(shù)和配置文件sql語句的參數(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>
#{}里面的名稱對應(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>
#{}里面的名稱對應(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>
#{}里面的名稱對應(yīng)的是User類里面的成員屬性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringSecurity?用戶帳號(hào)已被鎖定的問題及解決方法
這篇文章主要介紹了SpringSecurity?用戶帳號(hào)已被鎖定,本文給大家分享問題原因及解決方式,需要的朋友可以參考下2023-12-12快速入門介紹Java中強(qiáng)大的String.format()
這篇文章主要給大家介紹了如何快速入門介紹Java中強(qiáng)大的String.format()的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁數(shù)據(jù)查詢的過程詳解
這篇文章主要給大家介紹了關(guān)于利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁數(shù)據(jù)查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08java排查一個(gè)線上死循環(huán)cpu暴漲的過程分析
這篇文章主要介紹了java排查一個(gè)線上死循環(huán)cpu暴漲的過程分析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Spring主配置文件(applicationContext.xml) 導(dǎo)入約束詳解
在本篇文章里我們給各位整理的是關(guān)于Spring主配置文件(applicationContext.xml) 導(dǎo)入約束的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要參考下。2019-08-08