前言
MyBatis Mapper出现了nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘levelName’ not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2],说明是Mapper接口方法的参数在编译的时候没有按照代码写的参数来进行。需要解决这个问题,可以从以下方面入手。
Maven Compiler插件
从Java 1.8开始,编译的时候加上 -parameters 是可以将参数名保存到class文件里的,
而使用 Apache Maven Compiler插件,加上一点配置,是可以自动将这个参数加上的,
如果发现没有引入这个插件,或者这个插件没有开启parameters
,可以尝试加上这个参数。
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><parameters>true</parameters></configuration></plugin></plugins>
</build>
另外,需要注意的是parameters参数是3.6.1以后加入的功能,所以要保证maven-compiler-plugin的版本是3.6.1以上。
Maven Resouces插件
还有一种可能是没有使用maven-resources-plugin,将sql mapper的xml文件打到包里面,
可以检查下项目的pom中是否引入了这个插件
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><propertiesEncoding>${project.build.sourceEncoding}</propertiesEncoding><delimiters><delimiter>${resource.delimiter}</delimiter></delimiters><useDefaultDelimiters>false</useDefaultDelimiters></configuration></plugin></plugins>
</build>
@Param注解
其实如果你的pom工程是基于 spring-boot-starter-parent 构建的,而且自己也没有重新定义过插件的配置,那么应该是不会出现问题的:
<parent><groupId>org.springframework.boot</groupId><artifactId>weareint-spring-boot-dependencies</artifactId><version>2.6.x</version></parent>
反之,如果是团队自己维护的parent,而团队暂时无法解决这个问题时,只能自己辛苦点,在自己的Mapper方法参数前,加上@Param
注解
import org.apache.ibatis.annotations.Param;@Mapper
public interface MyMapper {int countByCode(@Param("code") String code);
}