大良营销网站建设效果,网站开发的技术,wordpress文章网址采集器,网站建设教程浩森宇特文章目录 背景什么是ParamParam的使用方法使用方法#xff1a;遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景
最近在开发过程中#xff0c;在写mapper接口是在参数前加了Param注解#xff0c;但是在运行的时候就会报错#xff0c;说… 文章目录 背景什么是ParamParam的使用方法使用方法遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景
最近在开发过程中在写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注解指定参数名称
void insertUser(Param(user) User user);在Mapper XML文件中可以使用#{user}来引用参数。
2、在Mapper接口方法的参数前使用Param注解指定多个参数名称
void insertUserAndRole(Param(user) User user, Param(role) Role role);在Mapper XML文件中可以使用#{user}和#{role}来引用参数。
3、在Mapper接口方法的参数前使用Param注解指定相同的参数名称
void insertUsers(Param(users) ListUser users);在Mapper XML文件中可以使用#{users}来引用参数。
4、在Mapper接口方法的参数前使用Param注解指定多个相同的参数名称
void insertUserAndRoles(Param(users) ListUser users, Param(roles) ListRole roles);在Mapper XML文件中可以使用#{users}和#{roles}来引用参数。
5、在Mapper接口方法的参数前不使用Param注解
void insertUser(User user);在Mapper XML文件中可以使用#{arg0}来引用参数或者把#{arg0}替换为#{user}
6、在Mapper接口方法的参数前不使用Param注解但有多个参数
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异常。
遇到的问题及因
这是我写的mapper接口 int setDefaultRole( ListSysRole roleList);
以及xml文件
update idsetDefaultRole update sys_rolesetforeach collectionroleList itemrole separator,default_role#{role.defaultRole},update_by#{role.updateBy},update_timesysdate()/foreach/setwhere role_id inforeach collectionroleList itemrole open( close) separator,#{role.roleId}/foreachand del_flag0/update那么在xml文件中用到了多个关于roleList的多个参数所以这里如果不使用Param注解是不可以他不能对应上对应的参数 这个错误通常是由于Mapper接口方法的参数和Mapper XML文件中的参数名不一致导致的。
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注解 void insertUser(User user); 在Mapper接口方法中直接使用参数对象作为方法的参数例如User user。在Mapper XML文件中可以使用#{}占位符来引用参数的属性例如#{id}和#{name}。
使用Param注解 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注解并指定参数的名称。例如
void insertUser(Param(user) User user);这里使用Param(“user”)注解明确指定了参数的名称为user。
MyBatis解析Mapper接口方法时会通过反射获取方法的参数信息包括参数的名称和类型。这是通过Java的反射机制实现的。
在解析Mapper XML文件时MyBatis会使用ParamNameResolver类来解析占位符中的参数名称。ParamNameResolver会根据方法的参数列表和参数名称确定参数的映射关系。
在Mapper XML文件中可以使用#{}占位符来引用参数。占位符中的名称应与Java代码中的参数名称一致。例如
insert idinsertUser parameterTypecom.example.UserINSERT 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注解时需要根据具体情况进行权衡和取舍。