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

}

原来的配置文件

 <select id="findAdmin" resultType="Admin">
        select * from hotel.admin
        where username=#{username}
        and password=#{password}
    </select>

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、接口中方法不变,按照错误提示进行修改,修改配置文件中的参数修改为可用的

配置文件

 <select id="findAdmin" resultType="Admin">
        select * from hotel.admin
        where username=#{param1}
        and password=#{param2}
    </select>

接口中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);

配置文件

 <select id="findAdmin" resultType="Admin">
        select * from hotel.admin
        where username=#{username}
        and password=#{password}
    </select>
  1. 接口中的方法不变,修改配置文件,将配置文件修改如下,即按照传进来参数的下标来取值

配置文件

  <select id="findAdmin" resultType="Admin">
        select * from hotel.admin
        where username=#{0}
        and password=#{1}
    </select>

findAdmin()方法

   //查询全部用户
   
   Admin findAdmin(String username, int password);

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一款优秀的持久层框架,它对JDBC的操作数据库的过程进行了封装,使得开发者只需要关注SQL语句本身,而不需要花费精力去处理例如注册驱动、创建连接、创建Statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。在MyBatis中,@Param注解用于给SQL语句中的参数命名,可以在SQL语句中直接引用该参数名,而不是使用默认的参数名。使用@Param注解可以避免因为参数名不同而导致的错误,同时也可以使得SQL语句更加清晰易懂。 举个例子,假设我们有一个查询用户信息的方法: ``` public User getUserById(int id, String name); ``` 如果我们使用MyBatis进行SQL映射,可以这样写: ``` <select id="getUserById" resultType="User"> select * from user where id = #{id} and name = #{name} </select> ``` 其中#{id}和#{name}就是使用@Param注解指定的参数名。在Java代码中,我们需要这样调用该方法: ``` User user = getUserById(1, "Tom"); ``` 这里的参数名与SQL语句中的参数名是一致的,因此MyBatis可以正确地将参数传递给SQL语句执行。如果我们不使用@Param注解,则需要这样写: ``` <select id="getUserById" resultType="User"> select * from user where id = #{arg0} and name = #{arg1} </select> ``` 这里的#{arg0}和#{arg1}是MyBatis默认的参数名,与Java代码中的参数名不一致,因此需要手动设置参数: ``` User user = getUserById(1, "Tom"); ``` 使用@Param注解可以避免这种手动设置参数的过程,使得代码更加简洁易懂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值