1.不使用@Param

  1. 只能有一个参数

  2. 该参数只能为Javabean类型(即参数只能是对象)

  3. sql语句只能使用 # 获取参数值

  4. 在SQL语句中,可以直接获取对象的字段,而不需要使用“对象.字段”的形式(这样使用反而会报错)

举例一

    mapper中的方法: (两种写法)

        #注解写法

#注解
    @Select("SELECT * from Table where id = #{id}")
    list<User> selectUserById(User user);

2.使用@param

场景一@Param注解基本类型的参数(有多个参数)

 mapper中的方法:

public User selectUser(@Param("userName") String name,@Param("password") String pwd);

  映射到xml中的<select>标签:

<select id="selectUser" resultMap="User">  
   select * from user  where user_name = #{userName} and user_password=#{password}  
</select>

mapper层用@Param("userId"),则xml无需parameterType

场景二@Param注解JavaBean对象

参数为对象:SQL语句需要使用“对象.字段”的形式获取对象的字段值

SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制

mapper中的方法: 

public List<User> getAllUser(@Param("user") User u);

  映射到xml中的<select>标签:

<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">  
        select   
        from user t where 1=1  
             and   t.user_name = #{user.userName}  
              and   t.user_age = #{user.userAge}  
    </select>  

场景三 方法参数要取别名,需要@Param

当需要给一个参数取一个别名时,我们也需要@Param注解,例如:

        mapper中的方法: 

User getUserByUsername(@Param("name") String username);

映射到xml中的<select>标签

<select id="getUserByUsername" resultMap="BaseResultMap" parameterType="String">
        SELECT * FROM T_USER WHERE USERNAME = #{name}
</select>

场景四 xml中的SQL使用了$,需要@Param

 虽然$存在SQL注入安全问题,但是有时候确实要使用,比如说传入列名或者表名时,就需要加上@Param注解,例如:

        mapper中的方法:

List<User> getUsersOrderByParam(@Param("order_by") String order_by);

      映射到xml中的<select>标签

场景五 动态SQL中使用参数作为变量,则需要@Param注解,即使只有一个参数。

这一种是比较特殊的,但是也是容易出错的,如果在动态SQL中使用参数作为判断条件,那么久要加上@Param注解,例如:  

        mapper中的方法: 

User getUserById(@Param("id") Integer id);

映射到xml中的<select>标签

    <select id="getUserById" resultMap="BaseResultMap">
        SELECT * FROM T_USER
        <where>
            <if test="id != null">
                ID = #{id}
            </if>
        </where>
    </select>

3,注意点

当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。只不过${}取值会遭受网络攻击,造成信息泄露,推荐使用#{}

当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。

不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。