MyBatis 中简单类型参数引用

Mybatis 对于简单类型参数(基本数据类型、String)的传参绑定引用。可以有 使用@Param注解不使用@Param注解 两种方式实现

abstract

不使用@Param注解

以下Mapper接口接收一个简单类型int参数,同时形参前不使用@Param注解

1
2
3
4
@Mapper
public interface StudentMapper {
public List<Student> findById(int num);
}

在Mapper.xml映射文件中,有两个地方需要引用形参:sql语句和动态sql。对于前者,在未使用 @Param 注解的情况下,简单类型参数,可以用任意名称通过#{}、${}在sql语句中引用形参变量;而对于后者,只能使用 _parameter 来引用传入的形参,切记不要使用接口方法的形参名来引用(此处即为num),否则会失败

如下示例的mapper.xml映射文件,sql语句引用任意名来引用传入的参数即可,故可以使用id,而在动态sql中使用方法接口的形参名num来引用传入的参数

1
2
3
4
5
6
7
8
<select id="findById" parameterType="int" resultMap="studentResultMap">
SELECT * FROM user
<where>
<if test="num != 30">
id = #{id}
</if>
</where>
</select>

当通过service向该dao接口传入数据时(num = 15)后,程序会抛出异常,提示没有num的get方法

ERROR 21464 —- [nio-8088-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘num’ in ‘class java.lang.Integer’] with root cause

对于上述异常,解决方案是在动态sql的参数引用使用 _parameter 即可

1
2
3
4
5
6
7
8
<select id="findById" parameterType="int" resultMap="studentResultMap">
SELECT * FROM user
<where>
<if test="_parameter != 30">
id = #{id}
</if>
</where>
</select>

从下述执行结果可以看出,该sql被正常解析拼接

report 1.jpg

使用@Param注解

以下Mapper接口接收一个简单类型int参数,但是形参前使用@Param注解来标识该参数,则在mapper.xml映射文件中,无论是sql语句和动态语句中,都需要使用该@Param注解的标识来引用该参数

以下Mapper接口接收一个简单类型int参数,同时形参前使用@Param注解来标识该形参

1
2
3
4
@Mapper
public interface StudentMapper {
public List<Student> findById(@Param("num2") int num);
}

则在Mapper.xml文件中,sql语句和动态sql都只能通过@Param注解的标识 num2 来引用参数,如下所示:

1
2
3
4
5
6
7
8
<select id="findById" parameterType="int" resultMap="studentResultMap">
SELECT * FROM user
<where>
<if test="num2 != 30">
id = #{num2}
</if>
</where>
</select>

当传入参数为30和15时,sql语句拼接结果如下,可以看到sql语句正常:

report 2.jpg

report 3.jpg

0%