33. MyBatis中的`@Param`注解如何使用?如何在Mapper接口中传递多个参数?
在 MyBatis 中,@Param
注解用于将方法参数绑定到 SQL 语句中的命名参数。它主要用于在 Mapper
接口中传递多个参数,以便在 SQL 语句中更方便地引用这些参数。
为什么使用 @Param
注解?
在 MyBatis 中,当 Mapper
接口的方法只有一个参数时,MyBatis 会默认将这个参数的名称绑定为 #{parameter}
,可以直接在 SQL 语句中引用它。如果方法有多个参数,MyBatis 默认使用 param1
、param2
等名称来引用这些参数,但这种方式不直观,也容易出错。为了使参数名称更加明确和可读,@Param
注解允许你为每个参数指定一个名称,从而在 SQL 语句中使用这个名称。
如何在 Mapper
接口中使用 @Param
注解传递多个参数?
1. 基本用法
假设我们有一个用户表 user
,表结构如下:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
我们要根据用户名和年龄来查询用户。
Step 1: 定义 Mapper
接口
在 Mapper
接口中使用 @Param
注解为方法的每个参数指定一个名称:
public interface UserMapper {
@Select("SELECT * FROM user WHERE name = #{name} AND age = #{age}")
User selectByNameAndAge(@Param("name") String name, @Param("age") int age);
}
@Param("name")
:指定name
参数在 SQL 语句中对应#{name}
。@Param("age")
:指定age
参数在 SQL 语句中对应#{age}
。
Step 2: 调用 Mapper
方法
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByNameAndAge("Alice", 30);
System.out.println(user);
}
在这个例子中,MyBatis 会将方法中的 name
和 age
参数分别绑定到 SQL 语句中的 #{name}
和 #{age}
占位符。
2. 传递多个参数给 XML 映射文件
如果 SQL 语句在 XML 映射文件中定义,可以同样使用 @Param
注解传递多个参数。
Step 1: 定义 Mapper
接口
public interface UserMapper {
User selectByNameAndAge(@Param("name") String name, @Param("age") int age);
}
Step 2: 在 XML 文件中使用 #{}
引用参数
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectByNameAndAge" resultType="User">
SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
</mapper>
MyBatis 会将 @Param
注解中指定的参数名称与 SQL 语句中的占位符 #{name}
和 #{age}
对应起来。
3. 使用 @Param
结合动态 SQL
当使用动态 SQL(如 <if>
、<choose>
等)时,@Param
注解也非常有用,能够帮助清晰地引用多个参数。
Step 1: 定义 Mapper
接口
public interface UserMapper {
List<User> selectUsers(@Param("name") String name, @Param("age") Integer age);
}
Step 2: 在 XML 中使用动态 SQL
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUsers" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
</mapper>
在这个例子中,如果传递的参数 name
和 age
为 null
,对应的条件将不会被添加到 SQL 语句中。@Param
注解使得动态 SQL 的编写更加直观和易读。
总结
@Param
注解:在 MyBatis 中,@Param
注解用于为Mapper
接口方法的参数指定名称,以便在 SQL 语句中使用更具可读性的参数名。- 多参数绑定:当
Mapper
方法中有多个参数时,通过@Param
注解为每个参数命名,可以避免使用默认的param1
、param2
等名称,使 SQL 语句更易读和维护。 - 动态 SQL:在使用动态 SQL 时,
@Param
注解同样适用,确保在复杂条件下参数的正确引用。
通过 @Param
注解,MyBatis 提供了更加灵活和清晰的方式来处理 SQL 语句中的参数绑定,尤其是在处理多参数的方法时,使代码更具可维护性和可读性。