Mybatis之mapper接口多參數(shù)方式
Mybatis mapper接口多參數(shù)
mybatis mapper接口類可以通過五種方法接收多個(gè)參數(shù)
方法一:利用arg或param
利用arg或param獲取mapper接口類的多參數(shù)
arg可以通過#{arg0}、#{arg1}、#{arg2}…獲取接口中相對(duì)應(yīng)的參數(shù)
param可以通過#{param1}、#{param2}、#{param3}…獲取接口中相對(duì)應(yīng)的參數(shù)。
方法二:map
通過把參數(shù) 以鍵值對(duì) 的方式存儲(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ù)賦值給類對(duì)象的變量,然后把類對(duì)象作為mapper接口類的參數(shù),在mapper映射文件中編寫SQL語句需要調(diào)用參數(shù)值時(shí),可以通過類對(duì)象的變量名調(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 方式。
- 對(duì)于使用混合參數(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ù)沒有對(duì)應(yīng)起來,所以會(huì)出現(xiàn)參數(shù)未找到的情況,導(dǎo)致執(zhí)行sql時(shí)無法辨識(shí)id字段
上圖使用注解不對(duì),應(yīng)該改為@Param
擴(kuò)展:
2.@requestParam與@Param區(qū)別:
1.@RequestParam 用于controller層,是Spring的注解
標(biāo)注在Controller層方法的參數(shù)上,用來解決前端與后端參數(shù)不一致的問題。@RequestParam將請(qǐng)求參數(shù)和控制器方法的形參創(chuàng)建映射關(guān)系。
2.@Param 用于dao層,是mybatis中的注解
該注解標(biāo)注在dao接口中的方法參數(shù)上,用來簡(jiǎn)化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>#{}里面的名稱對(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類里面的成員屬性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 自定義注解實(shí)現(xiàn)Spring容器注入Bean方式(類似于mybatis的@MapperScans)
- 修改SpringBoot 中MyBatis的mapper.xml文件位置的過程詳解
- Mybatis報(bào)Type interface *.*Mapper is not known to the MapperRegis
- springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問題
- idea使用mybatis插件mapper中的方法爆紅的解決方案
- Mybatis不啟動(dòng)項(xiàng)目直接測(cè)試Mapper的實(shí)現(xiàn)方法
相關(guān)文章
Java獲取e.printStackTrace()打印的信息方式
這篇文章主要介紹了Java獲取e.printStackTrace()打印的信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java Swing實(shí)現(xiàn)的定制TextField功能示例
這篇文章主要介紹了Java Swing實(shí)現(xiàn)的定制TextField功能,結(jié)合實(shí)例形式分析了java swing組件TextField相關(guān)屬性功能與設(shè)置操作技巧,需要的朋友可以參考下2018-01-01
java如何在項(xiàng)目中實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出功能
這篇文章主要介紹了java如何在項(xiàng)目中實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出功能的相關(guān)資料,EasyExcel是一個(gè)基于Apache?POI開發(fā)的開源Java庫,用于簡(jiǎn)化Excel文件的讀寫操作,文中將用法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本
這篇文章主要介紹了Java如何實(shí)現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
使用bitset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)
下面小編就為大家?guī)硪黄褂胋itset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
如何解決shardingsphere報(bào)錯(cuò)Missing?the?data?source?name:‘null‘
使用ShardingSphere進(jìn)行分庫操作時(shí),如果遇到“Missing?the?datasource?name:?‘null’”的錯(cuò)誤,通常是因?yàn)樗僮鞯谋頉]有配置相關(guān)的路由信息,例如,如果在properties中僅配置了health_record和health_task的路由規(guī)則2024-11-11
一個(gè)處理用戶登陸的servlet簡(jiǎn)單實(shí)例
這篇文章主要介紹了一個(gè)處理用戶登陸的servlet簡(jiǎn)單實(shí)例,可通過servlet實(shí)現(xiàn)處理用戶登錄的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

