关于Mybatis的@Param诠释

原创
小哥 3年前 (2022-11-14) 阅读数 11 #大杂烩

关于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);

配置文件

 
  1. 接口中的方法不变,修改配置文件 ,将配置文件修改如下,即按照传进来参数的下标来取值

配置文件

  

findAdmin()方法

   //查询全部用户

   Admin findAdmin(String username, int password);

这里仅作为个人理解,想要更详细的解释可以去看官方文档 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters
为了避免这种问题的产生,还是不要马虎,对mapper层接口中方法传入的参数都是用@param注解。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除