@chenxuxiong
2016-05-23T08:54:17.000000Z
字数 979
阅读 901
数据库
1.首先是效率性
PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程。
预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即数据库缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,只需DBMS运行SQL语句。所以当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,特别是的大型的数据库中,它可以有效的也加快了访问数据库的速度。
2.其次,使用PreparedStatement对象可以大大提高代码的可读性和可维护性
使用占位符?代替将参数与SQL语句分离出来,这样就可以方便对程序的更改和延续,同样,也可以减少不必要的错误。
3.最后,安全性。
SQL注入攻击:预编译语句集,内置了处理SQL注入的能力
SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了!
注入例子:
sqlString = "select * from user where user.id = '" + userID + "' and user.password = "' + userPassword + "'";
其中userID, userPassword是从用户输入的用户名及密码。如果用户和密码输的都是 '1' or '1'='1',则服务器端生成的SQL语句如下:
sqlString = "select * from user where user.id ='1'or'1'='1'and user.password ='1'or'1'='1'
这个SQL语句中的where字句没有起到数据筛选的作用,因为只要数据库中有记录,就会返回一个结果不为空的记录集,查询就会通过。上面的例子说明:在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过PreparedStatement对象处理的情况下,所有的用户输入都不应该传递给SQL语句。