以Oracle为例吧

Statement为一条Sql语句生成运行计划,

假设要运行两条sql语句

select colume from table where colume=1;

select colume from table where colume=2;


会生成两个运行计划

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



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

select colume from table where colume=:x;

通过set不同数据仅仅须要生成一次运行计划。能够重用



是否使用绑定变量对系统影响很大。生成运行计划极为消耗资源

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



1.PreparedStatement是预编译的,对于批量处理能够大大提高效率.也叫JDBC存储过程

2.使用 Statement 对象。在对数据库仅仅运行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的优点。

3.statement每次运行sql语句,相关数据库都要运行sql语句的编译,preparedstatement是预编译得,preparedstatement支持批处理

4.

Code Fragment 1:

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERECOF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);

Code Fragment 2:

PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SETSALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();

片断2和片断1的差别在于,后者使用了PreparedStatement对象,而前者是普通的Statement对象。

PreparedStatement对象不仅包括了SQL语句,并且大多数情况下这个语句已经被预编译过,因而当其执行时,仅仅需DBMS执行SQL语句,而不必先编译。

当你须要执行Statement对象多次的时候。PreparedStatement对象将会大大减少执行时间,当然也加快了訪问数据库的速度。

这样的转换也给你带来非常大的便利。不必反复SQL语句的句法,而只需更改当中变量的值。便可又一次运行SQL语句。

选择PreparedStatement对象与否。在于同样句法的SQL语句是否运行了多次。并且两次之间的区别不过变量的不同。假设只运行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。

5.运行很多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常觉得PreparedStatement对象比Statement对象更有效,特别是假设带有不同參数的同一SQL语句被多次运行的时候。PreparedStatement对象同意数据库预编译SQL语句,这样在随后的运行中能够节省时间并添加代码的可读性。



然而,在Oracle环境中,开发者实际上有更大的灵活性。当使用Statement或PreparedStatement对象时,Oracle数据库会缓存SQL语句以便以后使用。

在一些情况下,因为驱动器自身须要额外的处理和在Java应用程序和Oracleserver间添加的网络活动,运行PreparedStatement对象实际上会花更长的时间。



然而,除了缓冲的问题之外。至少另一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给PreparedStatement对象的參数能够被强制进行类型转换。使开发者能够确保在插入或查询数据时与底层的数据库格式匹配。



当处理公共Web网站上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串參数会自己主动被驱动器忽略。

最简单的情况下。这就意味着当你的程序试着将字符串“D'Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”。从而导致悲慘的失败。差点儿非常少有必要创建你自己的字符串忽略代码。



在Web环境中,有恶意的用户会利用那些设计不完好的、不能正确处理字符串的应用程序。特别是在公共Web网站上,在没有首先通过PreparedStatement对象处理的情况下,全部的用户输入都不应该传递给SQL语句。

此外,在用户有机会改动SQL语句的地方。如HTML的隐藏区域或一个查询字符串上。SQL语句都不应该被显示出来。

在运行SQL命令时,我们有二种选择:能够使用PreparedStatement对象,也能够使用Statement对象。不管多少次地使用同一个SQL命令,PreparedStatement都仅仅对它解析和编译一次。

当使用Statement对象时,每次运行一个SQL命令时,都会对它进行解析和编译。

第一:

prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。

createStatement不会初始化,没有预处理。没次都是从0開始运行SQL



第二:

prepareStatement能够替换变量

在SQL语句中能够包括?

,能够用ps=conn.prepareStatement("select* from Cust where ID=?");

int sid=1001;

ps.setInt(1, sid);

rs = ps.executeQuery();

能够把?替换成变量。

而Statement仅仅能用

int sid=1001;

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("select * from Cust where ID="+sid);

来实现。



第三:

prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。

createStatement不会初始化。没有预处理。没次都是从0開始运行SQL

JDBC中的Statement和PreparedStatement的差别的更多相关文章

  1. JDBC中的Statement和PreparedStatement的区别

    JDBC中的Statement和PreparedStatement的区别  

  2. [转] JDBC中的Statement和PreparedStatement的区别

    以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume ...

  3. JDBC中的Statement 和PreparedStatement的区别?

    PreparedStatement是预编译的SQL语句,效率高于Statement. PreparedStatement支持操作符,相对于Statement更加灵活. PreparedStatemen ...

  4. jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程

    一. java.sql.*   和  javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...

  5. 【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

    在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了怎样使用JDBC驱动建立一个简单的 ...

  6. 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

    一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...

  7. JDBC预编译statement(preparedstatement)和statement的比较、execute与executeUpdate的区别

    和 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement除此之外,还能够通过设置 ...

  8. JDBC之Statement、PreparedStatement和CallableStatement

    JDBC提供了Statement.PreparedStatement和CallableStatement三种方式来执行查询语句,其中Statement用于通用查询,PreparedStatement用 ...

  9. 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入

    本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...

随机推荐

  1. Hive安装和部署

    在root的用户下搭建的 构建hive之前必须要先搭建好hadoop才可以. hive定义了一种类似SQL查询语言--HQL 类似SQL ,但是不完全相同 Hive是一个数据仓库,它部署在Hadoop ...

  2. jsp静态与动态包含的区别和联系

    1. <%@ include file=” ”%>是指令元素.<jsp:include page=” ”/>是行为元素 2. 最终编译成java文件的数目不同. * 静态包含在 ...

  3. 【WEB API项目实战干货系列】- WEB API入门(一)

    这篇做为这个系列的第一篇,做基本的介绍,有经验的人可以直接跳到第二部分创建 ProductController.   创建 Web API 项目 在这里我们使用VS2013, .NET 4.5.1创建 ...

  4. ueditor 和 umeditor 粘贴过滤问题

    最近遇到需要将WORD WPS等复制的带有格式的内容粘贴到富文本编辑器里面去掉冗余的HTML,只保留最有用的部分. 第一步肯定是先查官方文档了. http://fex.baidu.com/uedito ...

  5. Nginx-动态路由升级版

    前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...

  6. ajax事件请求

    首先,ajax是什么? ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. ajax是一种用于创建的快速动态网页的技术. 当async:true时,表示异步执行ajax代码:当as ...

  7. gcc调试 学习1

    gdb进入调试 b 6 在第6行设置断点 d 2 删除num为2的断点 info b 查看断点 run 运行 n 执行到断点1 s 如果下一条是函数就进入函数 n 继续执行 print i  输出i的 ...

  8. [转载] 使用HTML5的十大原因

    转载自http://www.williamlong.info/archives/3024.html 你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在IE中不 ...

  9. [转载] java垃圾回收机制

    转载自http://blog.csdn.net/randyjiawenjie/article/details/7551228 http://www.daniel-journey.com/archive ...

  10. [转载] 使用 Twitter Storm 处理实时的大数据

    转载自http://www.ibm.com/developerworks/cn/opensource/os-twitterstorm/ 流式处理大数据简介 Storm 是一个开源的.大数据处理系统,与 ...