【每天5分钟,了解一个知识点】
MyBatis 是一个非常强大的持久层框架。在实际应用中,我们经常会遇到需要向 SQL 语句传递多个参数的情况。那么,MyBatis 是如何实现多个传参的呢?今天我们就来详细探讨一下这个问题,并介绍一些相关的常见面试题。
一、MyBatis 实现多个传参的方法
使用 JavaBean 作为参数
这种方法是将多个参数封装到一个 JavaBean 中,然后在 MyBatis 的 Mapper 文件中通过属性名来引用这些参数。
例如,我们有一个查询用户信息的方法,需要传入用户 ID 和用户名两个参数。我们可以创建一个 UserParam 类,包含 userId 和 userName 两个属性,然后在 Mapper 方法中以这个 JavaBean 作为参数。
public class UserParam {
private Integer userId;
private String userName;
// 省略 getter 和 setter 方法
}
public interface UserMapper {
User selectUserByParam(UserParam userParam);
}
在 Mapper 文件中,可以这样写 SQL:
<select id=\"selectUserByParam\" resultType=\"User\">
SELECT * FROM user WHERE id = #{userId} AND name = #{userName}
</select>
使用 Map 作为参数
另一种方法是使用 Map 来传递多个参数。将参数以键值对的形式放入 Map 中,在 Mapper 文件中通过键来引用这些参数。
例如:
public interface UserMapper {
User selectUserByMap(Map<String, Object> params);
}
调用方法时:
Map<String, Object> params = new HashMap<>();
params.put(\"userId\", 1);
params.put(\"userName\", \"张三\");
userMapper.selectUserByMap(params);
在 Mapper 文件中:
<select id=\"selectUserByMap\" resultType=\"User\">
SELECT * FROM user WHERE id = #{userId} AND name = #{userName}
</select>
使用注解方式传递多个参数
MyBatis 还支持使用注解来传递多个参数。可以使用
@Param
注解为参数命名,然后在 SQL 中通过命名来引用参数。例如:
public interface UserMapper {
User selectUserByAnnotation(@Param(\"userId\") Integer userId, @Param(\"userName\") String userName);
}
在 Mapper 文件中:
<select id=\"selectUserByAnnotation\" resultType=\"User\">
SELECT * FROM user WHERE id = #{userId} AND name = #{userName}
</select>
二、常见面试题
MyBatis 中实现多个传参有哪些方式?请分别举例说明。
回答要点:介绍上述三种实现多个传参的方式,包括使用 JavaBean、Map 和注解,并给出相应的代码示例。
使用 JavaBean 作为参数和使用 Map 作为参数各有什么优缺点?
JavaBean:需要创建额外的类,如果参数较多,可能会导致类的数量过多。
Map:代码可读性相对较差,容易出现键名错误。在 SQL 中引用参数时,需要记住键名,容易出错。
JavaBean:代码结构更清晰,易于维护和扩展。可以为参数添加业务逻辑方法,提高代码的可读性和可维护性。
Map:灵活性高,可以动态地添加参数,不需要预先定义参数类。
优点:
缺点:
在 MyBatis 中,使用注解传递多个参数时需要注意什么?
回答要点:使用
@Param
注解为参数命名时,要确保命名的唯一性,避免在 SQL 中引用错误的参数。同时,要注意参数的顺序,确保与 SQL 中的参数顺序一致。
【关联阅读】




