@Param
注解在 Java 中(尤其是 MyBatis 框架中)非常常见,它的主要作用是:
🧠 作用:为 MyBatis 映射器接口方法的参数命名,以便在 SQL 中引用
✅ 举个例子你就明白了:
less
java
深色版本
@Select("SELECT * FROM users WHERE id = #{id}")
User selectById(@Param("id") Integer id);
在这个例子中:
@Param("id")
表示给传入的参数起一个名字叫"id"
。- 在 SQL 语句中就可以用
#{id}
来引用这个参数。
📌 为什么需要 @Param?
情况一:只有一个参数时(可以省略)
python
java
深色版本
@Select("SELECT * FROM users WHERE id = #{id}")
User selectById(Integer id);
✅ 这种情况可以不加 @Param
,MyBatis 默认会把参数名识别为 id
或 _parameter
。
情况二:有多个参数时(必须使用 @Param)
less
java
深色版本
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> findUsers(@Param("name") String name, @Param("age") int age);
❌ 如果你不加 @Param
,MyBatis 就不知道哪个参数对应 name
,哪个对应 age
,就会报错!
情况三:传入多个对象或 Map
less
java
深色版本
@Update({
"<script>",
"UPDATE orders SET status = #{status}",
"<where>",
"id IN",
"<foreach item='id' collection='ids' open='(' separator=',' close=')'>#{id}</foreach>",
"</where>",
"</script>"
})
int updateOrderStatus(@Param("ids") List<Integer> ids, @Param("status") String status);
在这种复杂场景下,@Param
可以让你清晰地指定每个参数的名称和用途。
🧩 总结一下:什么时候该用 @Param
?
参数数量 | 是否建议使用 @Param | 原因 |
---|---|---|
1个基本类型/简单对象 | ❌ 可选 | 可以不用,但加上更明确 |
多个参数 | ✅ 必须用 | 否则无法区分参数 |
多个集合/List/Map | ✅ 推荐用 | 避免歧义,便于 SQL 引用 |
📚 衍生知识:SQL 中还可以怎么写?
sql
sql
深色版本
WHERE name = #{name} AND age = #{age}
WHERE name = #{arg0} AND age = #{arg1} -- 不推荐,依赖顺序,可读性差
WHERE name = ${name} -- 不安全,慎用(容易被注入)
如果你是在使用 Spring Boot + MyBatis 开发项目,正确使用 @Param
是写出清晰、安全 SQL 的关键一步!