
一条效率差的sql语句,足以毁掉整个应用.
Statement是PreparedStatement的父接口,不进行预编译操作,减少了进行预编译的开销.单次运行PreparedStatement要比Statement要慢一些.
PreparedStatement可以实现Statement的所有功能,但是之所以叫它预编译指令,是因为在创建它的一个对象时可以给定具有一定格式的SQL字符串,然后用它的setXXX方法给指定的SQL语句以填空的方式赋值,具有这样的特性后,它在多次执行一条固定格式的字符串时就很方便,也更效率.不像Statement那样每次执行都要先编译字符串在执行SQL了.
PreparedStatement需要服务器端的支持来提高效率.比如在Oracle上就会有显著效果,而MySQL明确地说明了不支持PreparedStatement.
Oracle中会将所有的SQL语句先编译,叫做"执行计划",放在Oracle内部的一个特定的缓存中,每次遇到相同的SQL,就会先调用缓存中的,如果不预编译,每次都用Statement,那么每次都要编译,在缓冲中会有很多重复的"执行计划"影响数据库的性能.还有一点就是在使用setObject()的时候,记得一定要使用带targetSqlType参数的方法,来提高效率.
SQL注入攻击是利用设计上的漏洞,在目标服务器上运行SQL语句进行攻击,动态生成SQL语句时没有对用户输入的数据进行验证是SQL注入攻击得逞的主要原因.
对于JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在插入时改变查询的逻辑结构.
绕过验证,但这种手段只对Statement有效,对PreparedStatement无效.
如果有一条SQL

本文探讨了PreparedStatement相对于Statement在Oracle中的效率优势,强调了预编译对于减少重复执行计划和提升性能的作用。同时,文章指出PreparedStatement能有效防止SQL注入攻击,因为它不会改变查询逻辑结构。通过对比Statement和PreparedStatement处理用户输入的方式,解释了为何PreparedStatement不易受到SQL注入的影响。
最低0.47元/天 解锁文章
597

被折叠的 条评论
为什么被折叠?



