前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@Param详解

@Param详解

原创
作者头像
用户4396583
发布2024-08-05 09:59:43
1160
发布2024-08-05 09:59:43
举报
文章被收录于专栏:spring-boot 注解

背景

最近在开发过程中,在写mapper接口是在参数前加了@Param注解,但是在运行的时候就会报错,说是找不到参数、

nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘defaultRole’ not found. Available parameters are role, param1

什么是@Param

@Param注解是一种用于标记方法参数的注解,它用于指定该参数的名称和类型,在使用该参数时可以通过名称来引用。在不同的编程语言和框架中,@Param注解的具体用法和功能可能会有所不同。

在Java开发中,如果用到了mybatis,那么@Param是用户给方法参数指定一个名称,以便在Mapper XML文件中引用该参数。

@Param的使用方法使用方法:

当使用MyBatis框架时,@Param注解有以下几种使用方法:

1、在Mapper接口方法的参数前使用@Param注解指定参数名称:

代码语言:java
复制
void insertUser(@Param("user") User user);

在Mapper XML文件中可以使用#{user}来引用参数。

2、在Mapper接口方法的参数前使用@Param注解指定多个参数名称:

代码语言:java
复制
void insertUserAndRole(@Param("user") User user, @Param("role") Role role);

在Mapper XML文件中可以使用#{user}#{role}来引用参数。

3、在Mapper接口方法的参数前使用@Param注解指定相同的参数名称:

代码语言:java
复制
void insertUsers(@Param("users") List<User> users);

在Mapper XML文件中可以使用#{users}来引用参数。

4、在Mapper接口方法的参数前使用@Param注解指定多个相同的参数名称:

代码语言:java
复制
void insertUserAndRoles(@Param("users") List<User> users, @Param("roles") List<Role> roles);

在Mapper XML文件中可以使用#{users}#{roles}来引用参数。

5、在Mapper接口方法的参数前不使用@Param注解:

代码语言:java
复制
void insertUser(User user);

在Mapper XML文件中可以使用#{arg0}来引用参数,或者把#{arg0}替换为#{user}

6、在Mapper接口方法的参数前不使用@Param注解,但有多个参数:

代码语言:java
复制
void insertUserAndRole(User user, Role role);

在Mapper XML文件中可以使用#{arg0}#{arg1}来引用参数。

这些是@Param注解的常见使用方法。通过使用@Param注解,可以明确指定Mapper接口方法参数的名称,使得在Mapper XML文件中引用参数更加直观和可读。

原理:

@Param注解的作用是给Mapper接口方法的参数命名,以便在Mapper XML文件中引用这些参数。没有@Param注解时,MyBatis无法识别参数的名称,导致无法正确引用参数。

在编译时,Java编译器会将@Param注解保留在编译后的字节码文件中。MyBatis通过Java的反射机制获取Mapper接口方法的参数列表,并检查是否存在@Param注解。

当解析Mapper XML文件时,MyBatis会根据#{}占位符中的名称来查找对应的参数。如果找不到与占位符名称匹配的参数,MyBatis会抛出BindingException异常。

@Param解决了什么问题

@Param注解主要解决了以下两个问题:

解决多个参数的问题: 在Mapper接口方法中,如果存在多个参数,MyBatis默认会将这些参数封装为一个Map对象,并以参数名作为键,参数值作为值。但是,当需要在Mapper XML文件中引用这些参数时,就需要使用#{}占位符,并指定对应的参数名。而@Param注解可以明确指定参数的名称,使得在Mapper XML文件中引用参数更加直观和可读。

解决参数名与Mapper XML文件中占位符名称不一致的问题: 在Mapper XML文件中,使用#{}占位符来引用参数,占位符中的名称应该与Java代码中的参数名称一致。但是,Java编译器在编译时会将参数名擦除,导致在运行时无法获取参数的名称。而@Param注解可以保留参数的名称,并在运行时通过反射机制获取参数的名称,从而确保参数名与占位符名称一致。

通过使用@Param注解,可以提高Mapper接口方法的可读性和可维护性,避免了潜在的错误。它确保了Mapper XML文件中的参数引用与Java代码中的参数名称一致。

使用与不使用对比

使用@Param注解和不使用的区别主要体现在Mapper接口方法的参数映射上。

  • 不使用@Param注解:
代码语言:java
复制
void insertUser(User user);

在Mapper接口方法中,直接使用参数对象作为方法的参数,例如User user。在Mapper XML文件中,可以使用#{}占位符来引用参数的属性,例如#{id}和#{name}。

  • 使用@Param注解:
代码语言:java
复制
void insertUser(@Param(“user”) User user);

在Mapper接口方法中,使用@Param注解来明确指定参数的名称,例如@Param(“user”)。在Mapper XML文件中,可以使用#{}占位符来引用参数,占位符中的名称应与@Param注解中指定的名称一致,例如#{user.id}#{user.name}

使用@Param注解的优势是可以提高Mapper接口方法的可读性和可维护性。通过明确指定参数的名称,可以确保参数名与占位符名称一致,避免因为参数顺序变化或者重载方法导致的错误。

总结起来,使用@Param注解可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致,而不使用@Param注解则直接使用参数对象作为方法的参数。

@Param是如何进行映射的

当使用@Param注解时,MyBatis会通过反射机制获取Mapper接口方法的参数信息,包括参数的名称和类型。然后,MyBatis会将这些参数信息与方法的参数列表进行关联,以便后续在Mapper XML文件中引用这些参数。

具体的映射过程如下:

在Mapper接口方法上使用@Param注解,并指定参数的名称。例如:

代码语言:java
复制
void insertUser(@Param("user") User user);

这里使用@Param(“user”)注解明确指定了参数的名称为"user"

MyBatis解析Mapper接口方法时,会通过反射获取方法的参数信息,包括参数的名称和类型。这是通过Java的反射机制实现的。

在解析Mapper XML文件时,MyBatis会使用ParamNameResolver类来解析占位符中的参数名称。ParamNameResolver会根据方法的参数列表和参数名称,确定参数的映射关系。

在Mapper XML文件中,可以使用#{}占位符来引用参数。占位符中的名称应与Java代码中的参数名称一致。例如:

代码语言:java
复制
<insert id="insertUser" parameterType="com.example.User">
  INSERT INTO user (id, name) VALUES (#{user.id}, #{user.name})
</insert>

这里使用#{user.id}#{user.name}来引用参数。

通过以上过程,@Param注解实现了参数名称与Mapper XML文件中占位符名称的映射关系。这样可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致。

总的来说,@Param注解的工作原理是通过反射机制获取参数信息,并将参数名称与方法的参数列表进行关联,以确保参数名与占位符名称一致。这样可以提高Mapper接口方法的可读性和可维护性。

总结

总结起来,@Param注解用于在Mapper接口方法中明确指定参数的名称,以提高方法的可读性和可维护性。以下是关于@Param注解的优缺点的总结:

  • 优点:

明确参数名称:使用@Param注解可以明确指定参数的名称,避免参数顺序变化或者重载方法导致的错误。这样可以提高代码的可读性和可维护性。

参数与占位符一致:@Param注解可以确保参数名与Mapper XML文件中的占位符名称一致,避免因为参数名与占位符不一致而引发的错误。

  • 缺点:

冗余代码:使用@Param注解会在Mapper接口方法中增加注解的代码,可能会导致代码的冗余。

额外的注解:使用@Param注解需要在Mapper接口方法中添加额外的注解,可能会增加代码的复杂性。

@Param注解可以提高Mapper接口方法的可读性和可维护性,确保参数名与占位符名称一致。然而,使用@Param注解可能会导致代码的冗余,同时也需要额外的注解。因此,在使用@Param注解时,需要根据具体情况进行权衡和取舍。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 什么是@Param
    • @Param的使用方法使用方法:
    • @Param解决了什么问题
    • 使用与不使用对比
    • @Param是如何进行映射的
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档