Mybatis中的#{}与${}
MyBatis映射配置文件中,动态传递参数两种方式:
- #{}:占位符
- ${}:拼接符
区别
- #{}为参数占位符?,即sql预编译;${}为字符串替换,即sql拼接。
- #{}:动态解析->预编译->执行;${}:动态解析->编译->执行。
- #{}的变量替换是在DBMS中;${}的变量替换是在DBMS外。
- 变量替换后,#{}对应的变量自动加上单引号’’;变量替换后,${}对应的变量不会加上单引号’’。
- #{}能防止sql注入;${}不能防止sql注入。
实例分析
假设传入参数为1,分析如下SQL
动态解析
-- #{}
select * from user where uid=#{uid}
-- ${}
select * from user where uid='${uid}'
预编译
-- #{}
select * from user where uid= ?
-- ${}
select * from user where uid= '1'
执行
-- #{}
select * from user where uid= '1'
-- ${}
select * from user where uid= '1'
传值
单值
-
#{}
无MyBatis默认值,可任意,且与参数名无关
-
${}
使用MyBatis默认值value,即${value}
使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
多值
-
#{}
使用MyBatis默认值arg0、arg1、arg2…或param1、param2、param3…
使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
-
${}
使用MyBatis默认值arg0、arg1、arg2…或param1、param2、param3…
使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
注:@Param("")是@Param(value="")的简写
使用技巧与建议
- 不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
- 能用#{}的地方就用#{},不用或少用${}
- 数据库对象(表名、字段名)做参数时,必须用${}。如:select * from ${tableName}
- order by时,必须用${}。如:select * from user order by ${columnName}
- 使用${}时,要注意何时加或不加单引号,即${}和’${}’