一、总结:
#{ }:占位符,防止sql注入
${ }:sql拼接符号
二、分析:
动态sql是mybatis的强大的特性之一。mybatis在对sql语句进行预编译之前会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态SQL进行处理。
在动态SQL解析中,#{ }和${ }不同:
#{ }解析为JDBC预编译语句(PreparedStatement)的参数标记符
例如:
select * from user where name = #{name}
解析为:
select * from user where name = ?
一个#{ }被解析为一个参数占位符?
${ }是一个字符串替换,在动态SQL解析阶段将会进行变量替换
select * from user where name = ${name}
当传递的参数为"zss"时,上述的sql语句被解析为:
select * from user where name = "zss"
三、使用
1、能使用#{ } 不使用${ }
2、$方式一般用于传入数据库对象,例如传入表名
3、排序时使用order by 动态参数时需要注意,用$而不是#