当前位置:首页 > 开发 > 数据库 > 正文

[转]JDBC中Statement与PreparedStatement的区别

发表于: 2014-03-05   作者:cvics_ailk   来源:转载   浏览次数:
摘要: JDBC中Statement与PreparedStatement的区别   1. statement每次执行sql语句,相关数据库都要执行sql语句的编译;preparedstatement是预编译的, 采用Cache机制(预编译语句,放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来,有利于sql生成查询计划。),对于批量处理可以大大提高效率. 也叫JDBC

JDBC中Statement与PreparedStatement的区别

 

1. statement每次执行sql语句,相关数据库都要执行sql语句的编译;preparedstatement是预编译的, 采用Cache机制(预编译语句,放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来,有利于sql生成查询计划。),对于批量处理可以大大提高效率. 也叫JDBC存储过程。

 

例如,如果要执行两条sql语句

 

SELECT colume FROM TABLE WHERE colume=1;
SELECT colume FROM TABLE WHERE colume=2;

 

会生成两个执行计划

 

一千个查询就生成一千个执行计划!

 

PreparedStatement用于使用绑定变量重用执行计划

 

SELECT colume FROM TABLE WHERE colume=:x;

 

通过set不同数据只需要生成一次执行计划,可以重用

 

是否使用绑定变量对系统影响非常大,生成执行计划极为消耗资源

 

两种实现 速度差距可能成百上千倍

 

后者使用了PreparedStatement对象,而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度

 

这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理,PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

 

2. PrepareStatement中执行的SQL语句中是可以带参数的,也就是说可以替换变量,尽量采用使用?号的方式传递参数,增加代码的可读性又可以预编译加速;而Statement则不可以。

 

3. 防止SQL注入。在SQL中包含特殊字符或SQL的关键字(如:’ or 1 or ‘)时,Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

 

SQL注入或者说SQL注入攻击就是利用Statement的漏洞完成的,例如用个用户登录,那么form表单有用户名和密码

 

那么我提交时,在用户名输入框内 输入 “aaa’ or ’a’=’a” 密码框随便输入,那么这样意味着 sql的

 

查询语言就是 “select * from 表 where 用户名=’aaa’ or ’a’=’a’ and 密码=’123’ ”,这样查询出来所有的数据或者是混乱。那么不被授权的用户照样可以登录,岂不是被黑了?!实际中现在java程序员早都不用这种方式写查询了,一般都用PreparedStatement来查询,或干脆就用hibernate之类的持久层框架,这样通过sql注入就无从谈起了。

[转]JDBC中Statement与PreparedStatement的区别

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
之前看JDBC规范的时候对PreparedStatement只是简单的知道会进行sql预编译,能提高性能。具体原理也
使用JDBC创建Connection后,执行SQL需要先创建Statement Statement stmt = connection.createStatem
原因: 某条记录的某个字段的值包含 单引号 ' 解决办法: 用两个单引号代替一个单引号 如: 查找用户
原因: 某条记录的某个字段的值包含 单引号 ' 解决办法: 用两个单引号代替一个单引号 如: 查找用户
原因: 某条记录的某个字段的值包含 单引号 ' 解决办法: 用两个单引号代替一个单引号 如: 查找用户
http://hi.baidu.com/bdivem/item/14ebf0bed57d6c4cbb0e1255 数据库在通过连接两张或多张表来返回记
为什么要使用PreparedStatement? 一、通过PreparedStatement提升性能 Statement主要用于执行静态SQ
一、什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子
在使用JDBC调用SQLServer执行Store Procedure时,遇到以下错误: com.microsoft.sqlserver.jdbc.SQL
http://www.cnblogs.com/tuyile006/archive/2007/05/08/738651.html 数据库在通过连接两张或多张表来
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号