在Mapper中如何传递多个参数(三种方式)

xml中#{0},#{1}方式

若Mapper层函数有多个参数,那么其对应的xml中,#{0}代表接收的是Mapper层中的第一个参数,#{1}代表Mapper中的第二个参数

xml中参数和Mapper方法中参数顺序一致。

  1. 定义Mapper接口:
// UserMapper.java
public interface UserMapper {
    List<User> getUsersByNameAndEmail(String name, String email);
}
  1. XML映射文件:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
  <select id="getUsersByNameAndEmail" resultType="com.example.User">
    SELECT * FROM users
    WHERE username = #{0} AND email = #{1}
  </select>
</mapper>

UserMapper接口的getUsersByNameAndEmail方法有两个参数,分别是name和email。

在XML映射文件中,我们使用#{0}和#{1}分别表示这两个参数的位置,这样在执行SQL查询时,MyBatis会自动将对应位置的参数值填充到SQL语句中,完成查询操作。

@Param方式

在MyBatis中,使用**@Param注解可以在Mapper接口方法的参数前加上注解,并指定注解内的参数名,这样在Mapper XML文件中可以直接引用这些参数名,而不再使用#{0}#{1}**等占位符。这使得代码更加直观和易于维护。

以下是使用**@Param**注解的示例代码:

  1. 定义Mapper接口:
// UserMapper.java
public interface UserMapper {
    List<User> getUsersByNameAndEmail(@Param("name") String name, @Param("email") String email);
}
  1. XML映射文件:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
  <select id="getUsersByNameAndEmail" resultType="com.example.User">
    SELECT * FROM users
    WHERE username = #{name} AND email = #{email}
  </select>
</mapper>

在上述示例中,UserMapper接口的getUsersByNameAndEmail方法有两个参数,分别是name和email,在方法的参数前使用了@Param注解,并指定了注解内的参数名。在XML映射文件中,我们可以直接引用@Param注解内指定的参数名(即name和email),而不再使用占位符,使得SQL语句更加清晰和易读。

对于没有使用**@Param**注解的情况,MyBatis会根据参数在方法参数列表中的位置顺序来绑定参数值。

如果使用了**@Param**注解为参数指定了名称,MyBatis会根据注解的名称来绑定参数值,而不再依赖参数的位置顺序。

Map方法

在MyBatis中,您可以将多个参数封装成一个Map,以HashMap的形式传递到Mapper中。

这样可以在Mapper接口方法中只接收一个Map参数

然后在Mapper XML文件中使用#{key}来引用Map中的键值对作为SQL参数。

  1. 定义Mapper接口:
// UserMapper.java
public interface UserMapper {
    List<User> getUsersByMap(Map<String, Object> params);
}
  1. XML映射文件:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
  <select id="getUsersByMap" resultType="com.example.User">
    SELECT * FROM users
    WHERE username = #{name} AND email = #{email}
  </select>
</mapper>
public List<User> getUsersByMap(String name, Integer age) {
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("name", name);
    paramMap.put("age", age);
    return userMapper.getUsersByMap(paramMap);
}

确保Map中的键名和Mapper XML文件中的参数名一致

特别是当参数的数量不固定或者不是常用的业务实体时,这种方式可以简化参数传递

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐