PreparedStatement 接口继承于Statement接口,该接口不仅拥有Statement接口中的所有方法,还针对带有参数的SQL语句的执行进行了扩展。
提示:
在实际开发过程中往往需要将一些外部输入的变量作为SQL语句的一部分,如果使用Statement接口来操作这种SQL语句,不仅会降低执行效率,还存在安全方面的问题。
PreparedStatement 接口提供的一些常用方法如表11.5所示。
表11.5 PreparedStatement接口常用方法
续表
提示:
setDate()方法的参数Date类型是java.sql.Date,不是java.util.Date。
PreparedStatement 接口可以执行带有参数的SQL语句,在编写SQL语句的时候可以使用占位符“?”代替SQL语句中的参数,让程序先对这种SQL语句进行预编译,然后在SQL语句执行之前通过PreparedStatement 接口提供的setXXX()方法为参数赋值。(www.daowen.com)
【例11.1】
在实际的开发过程中,如果涉及向SQL语句传递参数时,最好使用PreparedStatement接口进行实现。因为该接口不仅可以提高SQL的执行效率,还可以避免SQL语句的注入式攻击。
【例11.2】用户登录判断问题。
假设当前用户输入的用户名保存在变量usr中,密码保存在变量pwd中,使用SQL语句"select * from user where name=' "+usr+" ' and password = ' "+pwd+" ' "来进行判断。当用户输入的用户名和密码为“1'or'1'='1”,SQL语句在拼接输入变量之后会变为:
"select * from user where name='1'or'1'='1' and password = '1'or'1'='1' "
其中'1'='1' 为true,SQL语句的where条件将会失效,即只要数据表user存在数据,该SQL语句都能查询到结果,从而实现注入式攻击。
提示:
所谓SQL注入式攻击,就是通过输入特定数据和字符来构造(或者影响)SQL命令,进而欺骗服务器执行恶意的SQL命令。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。