关于Mybatis的@Param诠释
原创关于Mybatis的@Param注解
这几天想自己手写一个SSM项目。当然了,对于我这种需求不一定写完整,代码不要求花里胡哨的来说,整个流程下来,就是一种进步。在写的过程中就发现自己眼高手低的毛病,存在很多写的时候不太注意的问题。现全部总结,便于自己之后的观看。今天就来说一下我这新手,在平时不太喜欢使用的
注解@Param,给我造成的一些困扰和错误。
1、出现的错误
org.mybatis.spring.MyBatisSystemException: nested exception is
org.apache.ibatis.binding.BindingException: Parameter username not found.
Available parameters are [0, 1, param1, param2]
- 字段为username的参数没有查询到

2、 排查错误
定位错误

发现是接口 findAmin()方法 处的错误,我这里 原本写的接口 如下
@Component
public interface AdminMapper {
//查询全部用户
Admin findAdmin(String username, int password);
}
原来的配置文件
3、 原因分析
可以看到,接口中findAdmin()方法中的参数为两个,分别为username和password;在配置文件的结果集映射中为一个对象Admin,一个对象中有很多参数,当然了这里设置的admin这个实体类的属性虽然只有username和password两个;虽然我们自己知道username对应的是结果中的username,password对应的是password,但是传进去的参数太多,是没有办法互相对应的,所以会给这些传进去的参数一个默认的名称,就像错误类型中所说的那样 Available parameters are [0, 1, param1, param2] ,可以使用的参数名称为param1、param2,所以使用我们的 #{username},#{password}是取不到数据的。
所以这里我们有很多的解决方案,分别如下:
4、 解决办法
1、 接口中方法不变 ,按照错误提示进行修改, 修改配置文件 中的参数修改为可用的
配置文件
接口中findAdmin()方法
//查询全部用户
Admin findAdmin(String username, int password);
2、 配置文件不变 ,使用 @Param 给传进来的参数命名,只修改接口中的 findAdmin()方法 ,给方法中传进去的参数命名
给入参 String username 命名为username,然后sql语句…where iusername= #{username} 中就可以根据username得到参数值了
findAdmin()方法
//查询全部用户
Admin findAdmin(@Param("username") String username, @Param("password") int password);
配置文件
接口中的方法不变,修改配置文件,将配置文件修改如下,即按照传进来参数的下标来取值
配置文件
findAdmin()方法
//查询全部用户
Admin findAdmin(String username, int password);
这里仅作为个人理解,想要更详细的解释可以去看官方文档 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters 。
为了避免这种问题的产生,还是不要马虎,对mapper层接口中方法传入的参数都是用@param注解。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123


