淘先锋技术网

首页 1 2 3 4 5 6 7

报错信息:
在这里插入图片描述
报错译文:没有找到参数“certNoself”。可用参数为[arg1, argo, param1, param21
报错的方法:
在这里插入图片描述
译文很清楚就是参数的问题,这里涉及到的就是 在使用mybatis开发的时候,有时候需要传入多个参数进行查询,当传入多个参数 _传入多个参数_时,不处理便会出现上面的异常报错,这时需要用到一个注解 @Param

重要:如果不是上面的问题,但参数也没问题,那就一定看下Param的包,是不是导错了,我因为这个问题浪费了很多时间,然后看看下面的讲解

@Param

1.关于@Param
@Param是MyBatis所提供(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=< 参数数 <=5时使用最佳。
2.作用:
用注解来简化xml配置的时候(比如Mybatis的Mapper.xml中的sql参数引入),@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)。当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以,当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。

PS:下面看下spring中@param和mybatis中@param使用区别
1.spring中@param

/**
  * 查询指定用户和企业关联有没有配置角色
  * @param businessId memberId
  * @return
  */
int selectRoleCount(@Param("businessId") Integer businessId,@Param("memberId") Long memberId);

2.mybatis中的param

/**
 * 查询指定用户和企业关联有没有配置角色
 * @param businessId memberId
 * @return
 */
int selectRoleCount(@Param("businessId") Integer businessId,@Param("memberId") Long memberId);

从表面上看,两种并没有区别,但是在xml文件中使用的时候是有区别的,Spring中的@param在xml需要如下这样引用变量

<select id="selectRoleCount" resultType="java.lang.Integer" >
select 
  count(tbm.id)
  from t_business_member_relation tbm
  where tbm.business_id = #{0,jdbcType=INTEGER}
  and tbm.member_id = #{1,jdbcType=INTEGER}
  and tbm.role_business_id is not null
</select>

是根据参数的顺序来取值的,并且从0开始。而在mybatis @param在xml中则是如下这样引用变量的

<select id="selectRoleCount" resultType="java.lang.Integer" >
  select 
  count(tbm.id)
  from t_business_member_relation tbm
  where tbm.business_id = #{businessId,jdbcType=INTEGER}
  and tbm.member_id = #{memberId,jdbcType=INTEGER}
  and tbm.role_business_id is not null
 </select>

是通过参数名来引用的