Mybatis之mapper接口多参数方式
作者:龙卷风爱卷
Mybatis mapper接口多参数
mybatis mapper接口类可以通过五种方法接收多个参数
方法一:利用arg或param
利用arg或param获取mapper接口类的多参数
arg可以通过#{arg0}、#{arg1}、#{arg2}…获取接口中相对应的参数
param可以通过#{param1}、#{param2}、#{param3}…获取接口中相对应的参数。
方法二:map
通过把参数 以键值对 的方式存储到map集合中,然后把map集合作为mapper接口类的参数,在mapper映射文件中编写SQL语句需要调用参数值时,可以通过map集合的key调用。
public List<User> findUserMap(Map<String, Object> parameterMap);
<select id="findUserMap" parameterType="map" resultType="user"> <!-- concat:将多个字段连接起来,组成新的字段 --> select id,username from user where id=#{id} and username like concat('%',#{username},'%') </select>
方法三:通过Java Bean传递多个参数
通过把参数赋值给类对象的变量,然后把类对象作为mapper接口类的参数,在mapper映射文件中编写SQL语句需要调用参数值时,可以通过类对象的变量名调用。
方法四:@Param()
通过 @Param() 注解给参数加上key,在mapper映射文件中就可以通过key,所谓的key也就是@Param内value中的值。
//mapper多参数传入 User findUserOne(@Param(value = "username") String username, @Param("password") String password);
方法五:混合使用
在某些情况下可能需要混合使用几种方法来传递参数。
举个例子:
查询一个角色,可以通过角色名称和备注进行查询,与此同时还需要支持分页
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>
解析
当只传一个参数时,不需要@Param注解标注key,可以省略
注意
- 使用 map 传递参数导致了业务可读性的丧失,导致后续扩展和维护的困难,在实际的应用中要果断废弃这种方式。
- 使用 @Param 注解传递多个参数,受到参数个数(n)的影响。当 n≤5 时,这是最佳的传参方式,它比用 Java Bean 更好,因为它更加直观;当 n>5 时,多个参数将给调用带来困难,此时不推荐使用它。
- 当参数个数多于5个时,建议使用 Java Bean 方式。
- 对于使用混合参数的,要明确参数的合理性。
Mybatis mapper方法中绑定多个参数异常
1.mybatis mapper方法中绑定多个参数异常
问题如图所示:
代码:
Integer selectByWriteOffStatus(@RequestParam ("id") String id, @RequestParam("mobileNo") String mobileNo, @RequestParam("writeOffStatus") String writeOffStatus);
错误原因分析:
没有加@Param注解,Mapper中的参数和xml中sql语句的参数没有对应起来,所以会出现参数未找到的情况,导致执行sql时无法辨识id字段
上图使用注解不对,应该改为@Param
扩展:
2.@requestParam与@Param区别:
1.@RequestParam 用于controller层,是Spring的注解
标注在Controller层方法的参数上,用来解决前端与后端参数不一致的问题。@RequestParam将请求参数和控制器方法的形参创建映射关系。
2.@Param 用于dao层,是mybatis中的注解
该注解标注在dao接口中的方法参数上,用来简化xml配置的时候(比如Mybatis的Mapper.xml中的sql参数注入),@Param注解的作用是给参数命名,参数命名后就可以通过 #{xxx} 的形式注入sql语句中(xxx为@Param给参数设置的名称)。@Param注解是为了dao接口的方法参数和配置文件sql语句的参数保持变量名的一致性。
在mapper中如何传递多个参数
方法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>
#{}里面的数字代表传入参数的顺序。
方法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>
#{}里面的名称对应的是注解@Param括号里面修饰的名称。
方法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>
#{}里面的名称对应的是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>
#{}里面的名称对应的是User类里面的成员属性。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。