${}和#{}的区别


Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{} 和 ${}

我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串。

举个例子:

select * from student where student_name = #{name}

预编译后,会动态解析成一个参数标记符?:

select * from student where student_name = ?

而使用${}在动态解析时候,会直接替换传入值。

select * from student where student_name = zhangsan

总结:

1、能用#{}时尽量用#{},#{}可以防止SQL注入。

2、用${}传入数据直接显示在生成的sql中,如上面的语句,${}方式无法防止sql注入。

3、$一般用入传入数据库对象,比如数据库表名;分表的过程中具体把数据放入那个表,可以使用这个。

select * from ${tablename}  where username= #{username}

注意:

mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{}。