为什么Mybatis需要@Param

在一次正常的发布后,线上出现了这么一条错误信息:


image.png

这是mybatis参数绑定的时候找不到参数了,可是在开发环境明明是正常的呀,查询了相关资料后发现这种情况需要使用@Param指定参数的别名。

默认情况下,Mybatis会读取方法上的参数名称,但是当代码经过编译后,参数名称往往会丢失。比如:


image.png

java会把参数名编译成var1、var2...之类的名称,所有在开发环境能正常运行的代码,编译后在线上运行就会出问题了。


image.png

下面列举几种情况必须使用@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>

(使用很容易引起SQL注入,因此在实际生产中尽可能避免使用)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。