SQL中的占位符、@Param注解和方法参数
代码中出现的多个 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占位符 ,三者通过名称关联,最终目的是 安全地把用户输入的值传递给数据库查询 。