@Param
注解主要用于 MyBatis 進行參數傳遞時給 SQL 語句中的參數 起別名,通常用于 多參數 方法,使參數在 XML Mapper 文件或注解 SQL 語句中更清晰易用。
1. 基本用法
在 @Mapper
接口中使用 @Param
來為參數命名,避免 MyBatis 解析時出現參數名丟失的問題(尤其是多個參數時)。
示例:查詢用戶
@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{userId}")User findUserById(@Param("userId") Long id);
}
解釋:
@Param("userId")
給方法參數id
取別名userId
,- SQL 語句
#{userId}
通過 MyBatis 解析參數值。
2. 多參數使用 @Param
如果方法有 多個參數,MyBatis 默認無法識別參數名,必須使用 @Param
指定。
示例:根據用戶名和郵箱查詢用戶
@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND email = #{email}")User findByUsernameAndEmail(@Param("username") String username, @Param("email") String email);
}
相當于 SQL
SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';
3. @Param
在 XML 中使用
如果使用 XML 方式編寫 SQL,同樣需要 @Param
進行參數映射。
示例:XML 配置
Mapper 接口
@Mapper
public interface UserMapper {User findUserByName(@Param("name") String name);
}
UserMapper.xml
<select id="findUserByName" parameterType="string" resultType="User">SELECT * FROM users WHERE username = #{name}
</select>
#{name}
對應@Param("name")
,MyBatis 能正確解析參數。
4. 適用于 INSERT
、UPDATE
、DELETE
示例:更新用戶信息
@Update("UPDATE users SET email = #{email} WHERE username = #{username}")
void updateUserEmail(@Param("username") String username, @Param("email") String email);
調用:
userMapper.updateUserEmail("Tom", "newemail@example.com");
執行的 SQL:
UPDATE users SET email = 'newemail@example.com' WHERE username = 'Tom';
5. 適用于 IN
查詢(列表參數)
如果 SQL 需要 IN
語句,@Param
也可以用于傳遞 List。
示例:批量查詢用戶
@Select("<script>SELECT * FROM users WHERE id IN " +"<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>" +"</script>")
List<User> findUsersByIds(@Param("ids") List<Long> ids);
調用:
List<Long> userIds = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.findUsersByIds(userIds);
執行的 SQL:
SELECT * FROM users WHERE id IN (1, 2, 3);
6. 適用于 Map
作為參數
如果方法參數是 Map
,@Param
可以簡化參數獲取。
示例:傳遞 Map
查詢
@Select("SELECT * FROM users WHERE username = #{param.username} AND email = #{param.email}")
User findByMap(@Param("param") Map<String, Object> param);
調用:
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "Tom");
paramMap.put("email", "tom@example.com");User user = userMapper.findByMap(paramMap);
執行的 SQL:
SELECT * FROM users WHERE username = 'Tom' AND email = 'tom@example.com';
7. 適用于對象參數(拆分對象字段)
如果參數是對象,可以直接使用 #{對象.字段}
訪問屬性,但 @Param
仍然可用于 明確參數名稱。
示例:傳遞 User
對象
@Insert("INSERT INTO users(username, email) VALUES(#{user.username}, #{user.email})")
void insertUser(@Param("user") User user);
調用:
User user = new User("Alice", "alice@example.com");
userMapper.insertUser(user);
執行的 SQL:
INSERT INTO users(username, email) VALUES('Alice', 'alice@example.com');
總結
用法 | 示例 | 適用場景 |
---|---|---|
單個參數 | @Param("userId") Long id | 傳遞單個參數,避免 SQL 中參數混亂 |
多個參數 | @Param("username") String name, @Param("email") String email | 傳遞多個參數,保證 SQL 解析正確 |
XML 方式 | #{name} 對應 @Param("name") | XML 中映射參數 |
列表參數 | @Param("ids") List<Long> ids | IN 查詢 |
Map 參數 | @Param("param") Map<String, Object> | 傳遞多個參數,簡化方法參數列表 |
對象參數 | @Param("user") User user | 直接使用對象字段 |
什么時候必須用 @Param
?
? 必須用 @Param
的情況
- 多個參數,否則 MyBatis 可能無法正確解析
- SQL 中參數命名和方法參數不同
- XML 方式,參數需要手動映射
- List/Map 參數,用于
IN
查詢或動態 SQL
? 不需要 @Param
的情況
- 只有 一個參數 時,可以直接使用
#{參數名}
- 參數是 對象,可以直接
#{對象.字段}
訪問
💡 總結:
@Param
主要用于 多參數方法,保證 MyBatis 正確解析 SQL 參數,提高可讀性和維護性。