Mapper层@Param注解
1.不使用@Param
只能有一个参数
该参数只能为Javabean类型(即参数只能是对象)
sql语句只能使用 # 获取参数值
在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的属性。