Mybatis是一款优秀的持久化框架,它的优点之一就是支持多数据源和动态SQL,但在使用多数据源时,可能会发现使用同名的mapper.xml进行映射时,出现了问题。此时可以用 @Param
注解来区分同名方法。这里将对多个接口参数的注解使用方式进行详细讲解,并配合两个实例来加深理解。
什么是 @Param
注解
@Param
是 Mybatis 中的注解,表示为映射方法参数取别名。在 SQL 中,通过 #{别名}
来引用这个值。
例如:
public interface UserMapper{
List<User> getUserList(@Param("id") int id, @Param("name") String name, @Param("sex") String sex);
}
上面的代码在 SQL
中就可以这样使用:
SELECT * FROM user WHERE id = #{id} and name = #{name} and sex = #{sex}
在调用接口方法的时候,我们在传递参数时,需要使用这个注解标记参数,以便在 Mybatis 处理方法调用时,能够识别这个参数并在 SQL 中通过 #{别名}
映射过来。
为什么要使用 @Param
注解
实际开发中,常常有多个参数的情况,这时候我们需要在 XML
中编写多个 #{}
模板,并将参数全部按顺序传入,这样不但繁琐而且容易混淆,因此 Mybatis 提供了 @Param
注解,方便我们传递参数。
@Param
注解的使用方式
在接口方法的参数前,使用 @Param
注解并指定其中的参数名。在 XML 文件中就可以直接使用指定的参数名来取代之前的“数字”参数。
例如:
public interface UserMapper{
void updateUser(@Param("id") int id, @Param("name") String name, @Param("age") int age);
}
XML 中使用:
<update id="updateUser" parameterType="hashmap">
UPDATE USER SET name=#{name},age=#{age} WHERE id=#{id}
</update>
这样在接口方法中传入参数时,必须指定参数名。
例如:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(1, "Tom", 23);
这里传的必须是 updateUser( @Param("id") 1, @Param("name") "Tom", @Param("age") 23);
。
@Param
注解的注意事项
- 在
@Param
注解中的值必须与 XML 中#{}
中的值相一致。 - 接口中可以使用多个
@Param
注解进行参数注释,但是建议使用 POJO 对象传参。 - 如果一个方法只传一个参数,不需要使用
@Param
注解。
示例1:多参数查询示例
以下以一个多参数查询为例,来说明 @Param
注解的使用方法。
首先,在 mapper 接口类中定义方法 getUserList,该方法需要传递多个参数:
public interface UserMapper {
List<User> getUserList(@Param("name") String name, @Param("age") Integer age, @Param("sex") String sex);
}
在 XML 中定义了该方法的 SQL 语句:
<select id="getUserList" parameterType="hashmap" resultType="User">
SELECT * FROM user
WHERE 1 = 1 AND name LIKE CONCAT('%',#{name},'%')
<if test='age!=null'>AND age = #{age}</if>
<if test='sex!=null'>AND sex = #{sex}</if>
</select>
- 如果 age 不为 null,则会拼接
AND
条件age = #{age}
; - 如果 sex 不为 null,则会拼接
AND
条件sex = #{sex}
;
在执行查询方法时,先创建一个 map,用于存储传递的参数,最后将 map 传递给查询方法,方法中使用 @Param
注解引用 map 中的参数。
@Test
public void testGetUserList() {
UserMapper userMapper = openSession.getMapper(UserMapper.class);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "zhang");
paramMap.put("age", 20);
paramMap.put("sex", null);
List<User> users = userMapper.getUserList(paramMap);
for (User user : users) {
System.out.println(user);
}
openSession.close();
}
运行结果如下:
User(id=1, name=zhangsan, age=18, sex=男)
User(id=3, name=zhangsan, age=20, sex=女)
说明查询成功。
示例2:增加数据示例
以下以一个单表增加数据为例,来说明 @Param
注解的使用方法。
mapper 接口类中定义 add 方法,该方法需要传递多个参数:
public interface UserMapper {
void add(@Param("name") String name, @Param("age") Integer age, @Param("sex") String sex);
}
在 XML 中定义了该方法的 SQL 语句:
<insert id="add" parameterType="hashmap" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age, sex) VALUES (#{name}, #{age}, #{sex})
</insert>
在执行增加方法时,也需要先创建一个 map,用于存储传递的参数,最后将 map 传递给增加方法,方法中使用 @Param
注解引用 map 中的参数。
@Test
public void testAdd() {
UserMapper userMapper = openSession.getMapper(UserMapper.class);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "Tom");
paramMap.put("age", 22);
paramMap.put("sex", "男");
userMapper.add(paramMap);
System.out.println("插入数据的主键: " + paramMap.get("id"));
openSession.commit();
openSession.close();
}
运行结果如下:
插入数据的主键: 5
说明插入成功。
以上就是关于 mybatis多个接口参数的注解使用方式(@Param)
的完整攻略,通过此文,我们能够了解到 @Param
注解的语法格式,注意事项和两个实例操作,希望对您的工作有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis多个接口参数的注解使用方式(@Param) - Python技术站