先来看一个例子。

1
2
3
4
5
6
7
@Mapper
public interface LoginMapper {

@Select("select * from tb_user where phone=#{phone} and password=#{password}")
User getByPhoneAndPassword(String phone, String password);
}

在这段代码证,我们通过#{phone},#{password}占位符来获取形参phone和password。咋一看没错,但运行会发现报错:

说是找到不到phone参数。我们明明将形参名和#{}占位符里面的保持一致了,为什么还是找不到phone参数呢?

这是因为,在java8以前的版本中,编译器在编译的时候会将形参String phone编译为String arg0,并不会保留形参原来的名字。这个时候必须手动设置@Param参数完成映射。

1
2
@Select("select * from tb_user where phone=#{phone} and password=#{password}")
User getByPhoneAndPassword(@Param("phone")String phone, @Param("password")String password);

好在从java8之后,就提供了新特性。java8新特性:编译时保留方法参数名称

java8这个特性默认是关闭的,需要开启-parameters参数才能获取参数名称。

#pom.xml

1
2
3
4
5
6
7
8
9
10
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<compilerArgument>-parameters</compilerArgument>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

除了在pom.xml文件中配置,还可以手动使用命令:javac -parameters xxxxx.java,编译得到的class文件将保留参数名称。

配置完成后,重新运行,运行成功:

可能的问题:

在pom.xml中配置了-parameters参数,如果还是报找不到参数的错误,清理maven的缓存并重新编译。执行以下命令。

1
mvn clean compile

或者在idea的maven插件中,执行clean和compile生命周期。