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接受的话,就会把所有东西数据都返回出来
(4)并不是写了一定会有问题,可以用输入验证的方法来避免
7、$存在的意义(不需要加引号的时候不能用#,例如表名,字段名,列名等)
当我们需要对数据进行逆序正序排序的时候
(1)使用#(错误)
会执行失败因为我们用#我们的SQL识别的代码是
desc上多了个引号,所以会报错,不能有这两个单引号
(2)使用$(正确)
(3)如何避免SQL注入
(3.1)
(3.2)不接受用户url输入的参数,参数由后台来处理
8、模糊查询
(1)通过$来实现(这个方法没法换成#)
(2)利用CONCAT函数来使用#实现