目录
(参数为对象:SQL语句需要使用“对象.字段”的形式获取对象的字段值)
实例五:动态SQL中使用参数作为变量,则需要@Param注解,即使只有一个参数。
@param使用与否的区别
不使用@param:
- 只能有一个参数
- 该参数只能为Javabean类型(即参数只能是对象)
- sql语句只能使用 # 获取参数值
- 在SQL语句中,可以直接获取对象的字段,而不需要使用“对象.字段”的形式(这样使用反而会报错)
使用@param:
- 可以有多个参数
- 参数类型没有限制
- sql语句可以使用 # 或者 $ 获取参数值
- 若参数为对象,在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的属性。