SpringMVC + MyBatis 架构下,ServiceImpl 层需将多个业务参数(如 id、name、age)传递给 Mapper XML 的 SQL 语句。
<select id="selectUsers" parameterType="map" resultType="User">
SELECT * FROM user
WHERE id = #{id} AND name = #{name} AND age = #{age}
</select>
public List<User> queryUsers(Long id, String name, Integer age) {
Map<String, Object> params = new HashMap<>();
params.put("id", id);
params.put("name", name);
params.put("age", age);
SqlSession session = sqlSessionFactory.openSession();
try {
return session.selectList("namespace.selectUsers", params);
} finally {
session.close();
}
}
List<User> selectUsers(@Param("id") Long id,
@Param("name") String name,
@Param("age") Integer age);
MyBatis 自动将注解值映射为参数名,#{id} 直接可用。
| 维度 | Map 方案 | @Param 方案 |
|---|---|---|
| 参数数量 | 任意多 | 建议 ≤ 5 个 |
| 类型安全 | 运行时检查 | 编译时检查 |
| 重构友好 | 键名字符串易错 | IDE 支持重命名 |
| 动态参数 | 原生支持 | 需额外封装 |
| 推荐场景 | 通用查询、动态条件 | 固定业务方法 |
#{id}、#{name} 访问