在一次正常的发布后,线上出现了这么一条错误信息:
这是mybatis参数绑定的时候找不到参数了,可是在开发环境明明是正常的呀,查询了相关资料后发现这种情况需要使用@Param指定参数的别名。
默认情况下,Mybatis会读取方法上的参数名称,但是当代码经过编译后,参数名称往往会丢失。比如:
java会把参数名编译成var1、var2...之类的名称,所有在开发环境能正常运行的代码,编译后在线上运行就会出问题了。
下面列举几种情况必须使用@Param指定参数别名的情况
1. 方法有多个参数的,如:
int insert(@Param("staffName") String staffName, @Param("age") String age);
<insert id="insert" useGeneratedKeys="true">
INSERT INTO user(staff_name, age)value(#{staffName}, #{age})
</insert>
2. xml中使用了$,如:
List<User> select(@Param("order") String order);
<select id="select" resultType="java.lang.Integer">
select * from user ORDER BY ${order} desc
</select>
(使用)
3. 使用动态SQL,如:
List<User> select(@Param("id") String id);
<select id="select" resultType="java.lang.Integer">
select * from user
<where>
<if test="id!=null">
and staff_name = #{id}
</if>
</where>
</select>
所以,这也就解释了为什么有些接口能够正常运行,那就是方法只有一个参数的时候,但是为了风格的统一,建议还是对每一个参数都加上@Param