# 的作用

  在mybatis 中,推荐使用 #{参数名} 来给sql赋值参数。这样的好处,能有效的防止sql注入问题。因为他不管你是什么字符串。他都会给你头尾无情的用双引号括起来,那么不管你内容是什么,你操作再骚。也只能被数据库认为是字符串,不合法就报错给你。


  我们都知道,网站入侵就是采用sql注入,大量的注入,或巧妙的注入,来达到控制你数据库,或破坏你程序的目的。而 #{参数名} 会很有效的防止sql注入。


$作用

   他就是直接把参数赋值给sql语句,不做任何变换。那就等同于是我们又把sql注入的风险放开了。但是在某些情况下。我们不得不需要直接赋值参数。


例如下面这种情况:

    我们需要查询所有,然后根据某个字段进行排序;

关于mybatis 给中sql语句传参 # 和 $ 区别(图1)

加上双引号时,可以看见,他并没有对 sort 字段排序。但是如果我们去掉双引号。


关于mybatis 给中sql语句传参 # 和 $ 区别(图2)

可以看见他进行了排序,其实原理很简单。去掉双引号代表字段,不去掉代表一个字符串。而字符串时,mysql不知道该怎么办。


总结

所以,大部分情况下使用 # ,因为他能有效的防止sql注入问题。但是有些情况不得不使用 $ 来达到特殊的要求