(1)#{}是预编译处理,${}是字符串替换
(2)MyBatis在处理#{}时,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值
(3)MyBatis在处理 ${}时,就是把 ${}替换成变量的值,调用Statement来赋值
(4)使用#{}方式能够很大程度防止sql注入(提高系统安全),${}方式无法防止Sql注入
(5)#{}的变量替换是在DBMS(数据库管理系统)中、变量替换后,#{}对应的变量会自动加上单引号
${}的变量替换是在DBSM外、变量替换后,${}对应的变量不会加上单引号
注意:
1.在JDBC能使用占位符的地方,最好优先使用#{}
UPDATE t_address
SET is_default = 0
WHERE uid = #{uid}
2.在JDBC不支持使用占位符的地方,就只能使用${},典型情况就是 动态参数
(1)比如 有两张表,分别是emp_11 和 emp_22 .如果需要在查询语句中 动态指定表名,就只能使用 ${}
select * from emp_ ${year}
(2)再比如MyBatis 排序时使用order by 动态参数时,此时也只能使用 ${}
select * from dept order by ${name}