Ibatis插入注解报BindingException:参数'person'未找到,如何修复?
解决MyBatis BindingException: Parameter 'person' not found的问题
这个报错的核心原因是MyBatis默认无法识别多参数方法里的参数名称,当你的方法有多个参数时,它会用arg0、arg1(或者param1、param2)作为参数的默认键,而不是你定义的person和school。下面给你几种靠谱的修复方案:
方案一:使用@Param注解命名参数(推荐)
这是最直观也最常用的解决方式,给每个方法参数加上@Param注解指定参数名称,这样SQL里就能直接用你定义的名称了:
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Insert; // ... @Insert("INSERT INTO profile (person, school) VALUES (#{person}, #{school})") void insertOne(@Param("person") TestTextMessage person, @Param("school") String school);
加上@Param("person")后,MyBatis就会把第一个参数和SQL里的#{person}绑定,第二个参数同理,完美解决找不到参数的问题。
方案二:启用Java 8参数名称编译选项(无需加注解)
如果你的项目用的是MyBatis 3.4.1及以上版本,并且使用Java 8+,可以通过启用编译时的-parameters选项,让MyBatis直接识别方法参数的原名。
Maven配置示例
在你的pom.xml里添加编译插件的参数配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
配置后,你原来的代码就可以正常运行,不需要加@Param注解。但这种方式依赖编译配置,团队协作时要确保所有人的编译环境都配置了这个参数。
方案三:使用默认参数占位符(不推荐)
如果你不想加注解也不想改编译配置,也可以直接用MyBatis默认的参数键,比如arg0(第一个参数)、arg1(第二个参数),或者param1、param2:
@Insert("INSERT INTO profile (person, school) VALUES (#{arg0}, #{arg1})") void insertOne(TestTextMessage person, String school);
不过这种方式的可读性很差,后续维护代码时很难直接看出参数对应关系,所以不推荐在正式项目里使用。
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

