Mybatis之mapper接口多参数方式

 更新时间:2024年05月18日 15:06:52   作者:龙卷风爱卷  
这篇文章主要介绍了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类里面的成员属性。

总结

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

相关文章

  • MybatisPlus:使用SQL保留字(关键字)的操作

    MybatisPlus:使用SQL保留字(关键字)的操作

    这篇文章主要介绍了MybatisPlus:使用SQL保留字(关键字)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java swing实现的计算器功能完整实例

    Java swing实现的计算器功能完整实例

    这篇文章主要介绍了Java swing实现的计算器功能,结合完整实例形式分析了java基于swing组件实现计算器布局与运算功能的具体操作技巧,需要的朋友可以参考下
    2017-12-12
  • idea启动项目报端口号冲突或被占用的解决方法

    idea启动项目报端口号冲突或被占用的解决方法

    这篇文章主要介绍了idea启动项目报端口号冲突或被占用的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • spring boot整合redis实现shiro的分布式session共享的方法

    spring boot整合redis实现shiro的分布式session共享的方法

    本篇文章主要介绍了spring boot整合redis实现shiro的分布式session共享的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java实现常用的三种加密算法详解

    Java实现常用的三种加密算法详解

    编程中常见的加密算法有以下几种:信息摘要算法、对称加密算法以及非对称加密算法。本文将利用Java实现这几种常见的加密算法,需要的可以参考一下
    2022-03-03
  • 分享Java常用开发编辑器工具

    分享Java常用开发编辑器工具

    这篇文章主要给大家分享了分享Java常用开发编辑器工具,文章内容介绍非常详细,具有很大的参考价值,需要的小伙伴可以参考一下,希望对你的工作或学习有一定的帮助
    2022-03-03
  • java RSAUtils 加密工具类操作

    java RSAUtils 加密工具类操作

    这篇文章主要介绍了java RSAUtils 加密工具类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • java反射机制示例

    java反射机制示例

    这篇文章主要介绍了java反射机制示例,需要的朋友可以参考下
    2014-04-04
  • java 缓冲流的概念使用方法以及实例详解

    java 缓冲流的概念使用方法以及实例详解

    这篇文章主要为大家介绍了java 缓冲流的概念使用方法以及实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 使用Springboot实现word在线编辑保存

    使用Springboot实现word在线编辑保存

    PageOffice目前支持的Web编程语言及架构有:Java(JSP、SSH、MVC等),ASP.NET(C#、VB.NET、MVC、Razor等),PHP,ASP,本篇文章就带你使用Springboot整合PageOffice实现word在线编辑保存
    2021-08-08

最新评论