Mybatis:mapper接口中的@Param注解的用法总结

本文详细介绍了Java中@Param注解的使用场景,包括支持多个参数、不同类型,以及在SQL查询中的不同取值方式。特别强调了不使用@Param时的限制和安全注意事项,以及动态SQL中参数处理的特殊性。
摘要由CSDN通过智能技术生成

目录

@param使用与否的区别

        不使用@param:

        使用@param:

使用@param实例

实例一:@Param注解基本类型的参数(有多个参数)

实例二:@Param注解JavaBean对象

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

实例三:方法参数要取别名,需要@Param

实例四:xml中的SQL使用了$,需要@Param

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

不使用@param实例

注意点


@param使用与否的区别


        不使用@param:
  1. 只能有一个参数
  2. 该参数只能为Javabean类型(即参数只能是对象)
  3. sql语句只能使用 # 获取参数值
  4. 在SQL语句中,可以直接获取对象的字段,而不需要使用“对象.字段”的形式(这样使用反而会报错)
        使用@param:
  1. 可以有多个参数
  2. 参数类型没有限制
  3. sql语句可以使用 # 或者 $ 获取参数值
  4. 若参数为对象,在SQL语句中,需要使用“对象.字段”的形式获取对象的字段值

使用@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>

     其中where user_name = #{userName} and user_password = #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。

实例二:@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>标签

<select id="getUsersOrderByParam" resultMap="BaseResultMap" parameterType="String">
        SELECT * FROM T_USER
        <if test="order_by != null and order_by != ''">
            ORDER BY ${order_by} DESC
        </if>
</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>

不使用@param实例

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

        #注解写法

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

        #Mapper.xml写法        

  • 不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
  • 该例子中,未使用param注解,因此,若用xml格式(本文未写出来xml格式)在sql中使用#{id}的方式获取传入的该参数会报错
  • 个人建议使用param注解,较方便。

注意点

  •    当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。只不过${}取值会遭受网络攻击,造成信息泄露,推荐使用#{}
  •    当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
  •    不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
  • 17
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值