以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. font-face 在 Firefox无法正常工作问题

    @font-face存在的问题: 1.不同浏览器支持不同格式 2.Firefox默认情况下不允许跨域font-face,除非你可以添加“Access-Control-Allow-Origin” hea ...

  2. 【收藏】Web前端开发第三方插件大全

    收集整理了一些Web前端开发比较成熟的第三方插件,分享给大家. ******************************************************************** ...

  3. Js的闭包,这篇写的是比较清晰明了的

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  4. 建立LINUX服务器

    建立LINUX服务器:一. 下载UltraISO工具并用该工具制作LINUX启动U盘,制作步骤如下:http://www.linuxidc.com/Linux/2012-11/74695.htm [^ ...

  5. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  6. Python 解LeetCode:367. Valid Perfect Square

    题目描述:给出一个正整数,不使用内置函数,如sqrt(),判断这个数是不是一个数的平方. 思路:直接使用二分法,貌似没啥好说的.代码如下: class Solution(object): def is ...

  7. PLSQL锁表之后改如何操作

    (1)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...

  8. 百度地图Marker优化方案

    简介 在使用百度地图的时候,我们需要在地图上增加标注Marker来展示设置信息.随着用户需要不断增多,加载更多的Marker标注信息成为了一种奢望.然而通过自己技术的提升,归结出来了一下方案. 引入百 ...

  9. How To Use Linux epoll with Python

    http://scotdoyle.com/python-epoll-howto.html Line 1: The select module contains the epoll functional ...

  10. CTF 文件包含与伪协议

    正巧在写代码审计的文章,无意间看到了一篇CTF的代码审计,CTF题目很好,用的姿势正如标题,文件包含和伪协议. 先放出原文链接(http://www.freebuf.com/column/150028 ...