java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Mybatis mapper接口多参数

Mybatis之mapper接口多参数方式

作者:龙卷风爱卷

这篇文章主要介绍了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,可以省略

注意

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类里面的成员属性。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文