接上篇博客,沿用JDBC入门五:一个按部门查询员工功能的例子这篇博客中的案例代码;
采用PreparedStatement的策略,能够解决SQL注入攻击的问题。
目录
2.PreparedStatement和Statement比较
4.为什么使用参数化SQL的方式比拼接字符串的方式更加高效?(即为什么使用PrepareStatement的方式?)
1.PreparedStatemen简介
PreparedStatement:预编译Statement,其目的是解决SQL注入攻击的问题。
PreparedStatement:
(1)PreparedStatement本质也是一个接口,只是其继承自Statement接口;专用于对SQL语句进行预处理以后再去执行;
(2)在实际工作中,推荐使用PreparedStatement;
2.PreparedStatement和Statement比较
(1)Statement:
(2)PreparedStatement:
PreparedStatement用法和Statement用法差别还是挺大的;
(1)sql中的?相当于是一个参数,这个参数是需要PreparedStatement进行解析的;PreparedStatement对象提供了set***()方法来设置参数;
(2)【setString(1,dname)】中的1代表传入第一个参数,值为dname;
(3)PreparedStatement的作用是:【对sql进行预处理】,并且【对字符串中诸如单引号这样的特殊字符进行转义处理】,所以在执行的时候最终的SQL就变成了:
select * from employee where dname='\' or 1=1 or 1=\''
而其中,dname的值就是:【\' or 1=1 or 1=\'】(也就是' or 1=1 or 1='这个字符串),即dname是这个整个字符串,(这个字符串不会被作为SQL语句的一部分了,只是作为一个变量的值而已)所以最终就是查询不到任何结果;从而避免了注入攻击的情况。
(4)总结一下:即PreparedStatement根本就是,在SQL执行前进行参数化的处理,通过?将原有需要传入变量的部分,变成在下面通过set***(1,dname)通过参数进行传入的形式,同时对参数中的特殊字符进行转义的处理;