1.#{}和${}都可以用来动态获取参数
2.#{}相当于一个占位符,用于替换变量,sql语句会进行预编译(PreparedStatement ),会编译成一个?问号占位符,可以防止Sql注入,更安全;
select * from table where id = #{id};
等价于
PrepareStement prepareStement =stmt.createPrepareStement("select * from table where id = ?")
prepareStement.setString(1,'abc');
3.${}在sql语句中,只是拼接参数,不会有其他特殊处理,就普通编译(Statement);
用于变量替换
select * from table where id = #{id}
等效于
select * from table where id = 4;
4.什么时候用#,什么时候用$
#{}用在传变量值,特别进行,增删改操作时候时候,会预编译,#{}会解析成占位符?,可以预防sql注入
比如:
select age from user where name = #{name}
解析后:
select age from user where name = ?
${}在执行Sql语句,只对字符串进行了拼接,传的参数是真实的数据
比如传值为“汤圆”
select age from user where name = ${name}
解析后:
select age from user where name = "汤圆"
应用场景
# 能用#{}的尽量用#{},尤其是作为增删改的条件的,毕竟进行预编译,防止Sql注入,解析时候带单引号解析
$ 简单的字符串拼接,若遇到动态参数作为数据表的表名,就只能用${},这个地方用#{}会报语法错误,因为#{}是带引号解析的,在sql语法里面是没有引号的