这几天想自己手写一个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>
接口中的方法不变,修改配置文件
,将配置文件修改如下,即按照传进来参数的下标来取值
配置文件
<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注解。