1、参数是Integer类型时候没区别(#是预编译SQL,$是即时SQL)
2、当参数是String类型时,就会出错了
(1)这是$的报错信息,因为我们的参数admin并没有加引号所以不满足字符串条件
(2)正确的SQL
(3)改正的办法(给${name}加上单引号)
3、#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别
4、SQL的执行流程
(1)解析语法,检验SQL有没有问题
(2)SQL优化,编译,制定执行计划
(3)执行SQL
5、
(1)#的SQL效率更高
(2)#的SQL更安全(防⽌SQL注⼊)
6、SQL注入
(1)' ' or 1='1'(这人就成了为空或者1等于1)此时这个代码就成恒成立的了,会把我们所有的数据都显示出来
(2)他可能会对我们的数据库进行更改或者删除操作(' ' ;drop table XX;--')' '两个引号是一个语句,但是真正执行的时候后面的引号被我们注掉了,就成了两个执行语句,一个空,一个删除语句(这个问题现在已经被MyBatis解决掉了,被MyBatis拦截了)
(3)此时用List接受的话,就会把所有东西数据都返回出来
![](https://img-blog.csdnimg.cn/direct/5a3bbe8601cc434db3268f6982dee298.jpeg)
(4)并不是写了一定会有问题,可以用输入验证的方法来避免
7、$存在的意义(不需要加引号的时候不能用#,例如表名,字段名,列名等)
当我们需要对数据进行逆序正序排序的时候
(1)使用#(错误)
![](https://img-blog.csdnimg.cn/direct/71ecad98865e4eecb9a335e8fe95b1a4.jpeg)
![](https://img-blog.csdnimg.cn/direct/c8649431cc0241f2bf2f7d5f280c25e2.jpeg)
会执行失败因为我们用#我们的SQL识别的代码是
![](https://img-blog.csdnimg.cn/direct/485e41947afa42eebba490865d349ce0.jpeg)
desc上多了个引号,所以会报错,不能有这两个单引号
(2)使用$(正确)
![](https://img-blog.csdnimg.cn/direct/9baefd8908fe472886a58a3bfe79faf3.jpeg)
(3)如何避免SQL注入
(3.1)
![](https://img-blog.csdnimg.cn/direct/52de88c64e0742dba7f337271a2d7c3a.jpeg)
(3.2)不接受用户url输入的参数,参数由后台来处理
8、模糊查询
(1)通过$来实现(这个方法没法换成#)
![](https://img-blog.csdnimg.cn/direct/025b26a84869431b9e516ddf2764cb07.jpeg)
(2)利用CONCAT函数来使用#实现
![](https://img-blog.csdnimg.cn/direct/d73065663baf4c5d85e4d5273d87dc74.jpeg)