美文网首页
为什么Mybatis需要@Param

为什么Mybatis需要@Param

作者: 我是局长 | 来源:发表于2020-06-17 23:07 被阅读0次

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


    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

    相关文章

      网友评论

          本文标题:为什么Mybatis需要@Param

          本文链接:https://www.haomeiwen.com/subject/fanexktx.html