代碼中出現的多個 username 和 password 代表不同層面的變量,具體含義如下(按執行順序):
### 1. @Param("username") String username
- 位置 :方法參數前的注解
- 作用 :
- @Param("username") :給參數 命名 ,告訴MyBatis“這個參數對應SQL中的 #{username} ”
- String username :方法的 形參變量 ,接收外部傳入的用戶名(比如用戶登錄時輸入的值)
### 2. #{username}(SQL語句中)
- 位置 :SQL語句的條件部分
- 作用 :MyBatis的 參數占位符 ,會被替換成 @Param("username") 注解的參數值
- 安全機制 :自動防止SQL注入(比直接拼接字符串安全)
### 3. 數據庫表字段 username
- 位置 : tb_user 表中的字段名
- 作用 :存儲用戶賬號的 數據庫列名 ,與Java代碼無關,是數據庫設計的一部分
完整執行流程
用戶輸入 → 調用select方法 → @Param注解映射 → SQL參數替換 → 數據庫查詢↓ ↓ ↓ ↓ ↓
"張三" → String username → @Param("username") → #{username} → WHERE username = '張三'
### 為什么需要這么多同名變量?
- 分層設計 :Java代碼(方法參數)→ ORM框架(MyBatis注解)→ 數據庫(表字段)的 解耦
- 可讀性 :保持名稱一致讓代碼更易理解(看到 username 就知道是用戶名)
- 框架要求 :MyBatis需要通過 @Param 建立Java參數與SQL參數的映射關系
### 一句話總結
方法參數→注解命名→SQL占位符 ,三者通過名稱關聯,最終目的是 安全地把用戶輸入的值傳遞給數據庫查詢 。?
?