1、使用@Param注解的原因
在 Mapper接口中,当方法的参数为多个字面量类型,此时mybatis会将这些参数存储在一个Map集合中,以两种方式进行存储
- 1、以arg0.arg1…为键,以参数为值
- 2、以param1,param2…为键,以参数为值
例如:根据两个参数ename和job,查询emp的信息。
- 1、接口方法的习惯写法
Emp finEmpByEnameAndJob(String ename, String job);
- 2、SQL的习惯写法
<select id="finEmpByEnameAndJob" resultType="Emp">
select *
from emp
where ename = #{ename} and job = #{job};
</select>
- 3、执行查询操作
- 4、出现查询异常
### Cause: org.apache.ibatis.binding.BindingException:
Parameter 'ename' not found.
Available parameters are [arg1, arg0, param1, param2]
2、@Param注解的用法
2.1、@Param注解普通类型的参数
Mapper中的方法:
Emp finEmpByEnameAndJob(@Param("ename") String ename, @Param("job") String job);
映射到xml中的标签
<select id="finEmpByEnameAndJob" resultType="Emp">
select *
from emp
where ename = #{ename}
and job = #{job};
</select>
注意点:
其中where ename = #{ename} and job = #{job}中的ename和job都是从注解@Param() 里面取出来的,取出来的值就是方法中形式参数 int ename 和 String job的值。
2.2、@Param注解JavaBean对象
SQL语句通过@Param注解中的别名把对象中的属性取出来然后赋值
Mapper接口中的方法:
int addEmp(@Param("emp") Emp emp);
映射到xml中的标签
<insert id="addEmp">
insert into emp
values (#{emp.empno}, #{emp.ename},
#{emp.job}, #{emp.mgr},
#{emp.hiredate}, #{emp.sal},
#{emp.commit},#{emp.deptno});
</insert>
注意点:
在SQL语句中,通过使用@Param(“emp”)注解中的别名emp,对象emp中的属性取出来然后给SQL语句中的字段赋值。
3、注意事项
- 1、当使用了@Param注解来声明参数的时候,SQL语句取值使用#{ },${ }取值都可以。
- 2、当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
- 3、不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。