使用了@Param,还是出现nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX‘ 错误

使用了@Param,还是出现nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX’ 错误

碰到问题的过程

开发的时候出现了以下错误:

nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX’ not found.

看到这个错误的时候第一反应就是Dao层没有加@Param注解出现错误。但是去看Dao层的时候代码是这样的。

List<String> selectbbProjectIdList(@Param("dprojectId") long projectId, @Param("dsection")long section);

这明明加了@Param注解了呀!这个时候我怀疑是mapper.xml文件中#{}的内容和@Param注解内容不一样。

<select id="selectbbProjectIdList" resultType="string">
    SELECT item_project_id
    FROM intelligent_matching
    where base_project_id = #{dprojectId}
      and base_section_id = #{dsection}
select>

然而mapper.xml文件中的对应语句是上面的代码,但是#{}里面的内容没问题。
这时候我开始怀疑mybatis传入参数等,然而各种试都不行。报错都是nested exception is org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found.

解决办法

后面实在不知道怎么解决了,开始弄注解了,在用到@Mapper注解的时候发现
在这里插入图片描述
这个导入的@Param竟然不是mybatis的自带的!!!瞬间明白,原来我之前这个代码是用若依代码生成器自动生成的,而若依代码生成的@Param注解是引用了Spring的。@Param注解spring自带和mybatis的是有区别的。具体区别如下:

  1. Dao上用Spring 的@Param注解

    List<String> selectbbProjectIdList(@Param("dprojectId") long projectId, @Param("dsection")long section);
    
  2. Dao上用Mybatis的@Param注解

    List<String> selectbbProjectIdList(@Param("dprojectId") long projectId, @Param("dsection")long section);
    

这两个@Param注解在Dao层使用的时候单看代码是看不出区别,但在xml中变量引用就能体现区别。

  1. xml上用Spring 的@Param注解变量引用

    <select id="selectbbProjectIdList" resultType="string">
        SELECT item_project_id
        FROM intelligent_matching
        where base_project_id = #{0}
          and base_section_id = #{1}
    select>
    
  2. xml上用Mybatis的@Param注解变量引用

    <select id="selectbbProjectIdList" resultType="string">
        SELECT item_project_id
        FROM intelligent_matching
        where base_project_id = #{dprojectId}
          and base_section_id = #{dsection}
    select>
    

这个时候我就重新引入下包。
在这里插入图片描述

import org.apache.ibatis.annotations.Param;

选择第一个mybatis自带的,然后问题顺利解决!

总结

选用注解的时候要看清是哪个框架自带的注解。mybatis自带注解和spring自带的注解有些有区别,需要小心和弄明白。

// spring
import org.springframework.data.repository.query.Param;

// mybatis
import org.apache.ibatis.annotations.Param;

你可能感兴趣的:(MyBatis)