JDBC中的Statement和PreparedStatement的差别
以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的差别的更多相关文章
- JDBC中的Statement和PreparedStatement的区别
JDBC中的Statement和PreparedStatement的区别
- [转] JDBC中的Statement和PreparedStatement的区别
以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume ...
- JDBC中的Statement 和PreparedStatement的区别?
PreparedStatement是预编译的SQL语句,效率高于Statement. PreparedStatement支持操作符,相对于Statement更加灵活. PreparedStatemen ...
- jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程
一. java.sql.* 和 javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...
- 【Java编程】JDBC注入攻击-Statement 与 PreparedStatement
在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了怎样使用JDBC驱动建立一个简单的 ...
- 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理
一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...
- JDBC预编译statement(preparedstatement)和statement的比较、execute与executeUpdate的区别
和 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement除此之外,还能够通过设置 ...
- JDBC之Statement、PreparedStatement和CallableStatement
JDBC提供了Statement.PreparedStatement和CallableStatement三种方式来执行查询语句,其中Statement用于通用查询,PreparedStatement用 ...
- 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入
本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...
随机推荐
- grid 布局
display:grid 是一种新的布局方式,旧的布局方式通常有副作用,例如float(需要额外修复浮动)或者inline-block(两个元素之间的空格问题) 把父元素定义为grid,就像表格一 ...
- java中表示二进制、八进制、十进制、十六进制
1.进制 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 2.进制的表现形式 二进制: 由0和1两个数字组成. 八进制: 由0-7数字组成,为了区分与其他进制的数字区别, ...
- [html5] 初识绘图canvas
这个星期被调到别的项目组专门做了一会儿前端,没办法,人太少,我也只能硬着头皮上... 说起来,html5的canvas真的好用,可以画色块,可以嵌入图片,可以通过定位在图片上写字等等 举例如下 在ht ...
- 按键精灵 vbs 获取网页源码 xp系统被拒绝
如下面的代码所示,获取新浪博客某个指定网页的源码 verurl = "http://blog.sina.com.cn/s/blog_9ea1db7b0101o7ch.html?" ...
- 收集—— css实现垂直居中
Method1: 在父元素上设置display:table-cell;vertical-align:middle(父元素不能设置浮动) Method2: 使用flex:父元素设置成display: f ...
- 消息中间件ActiveMQ及Spring整合JMS的介绍
一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...
- freeMarker遍历map的正确方式
假设selectDateModel 是我们后台返回的map<String, String>; <#list selectDateModel?keys as key> <o ...
- Skylin CityBuilder 6.6.1 提示授权过期解决(License Manager中显示未过期)
最近工作中使用到Skyline 系列软件,授权一切正常,启动CityBuilder时提示授权过期 运行License Manger之后查看授权状态 ' 一切正常,并没有出现授权过期等情况. 如何解决: ...
- [转载] 基于Dubbo的Hessian协议实现远程调用
转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...
- 【Java入门提高篇】Day3 抽象类与接口的比较
抽象类跟接口都讲完了,现在来做一个比较. 其实说实话,没有多大的可比较性,它们是完全不同的两个东西,它们的抽象不在同一个层级上.但是为了让大家更好的理解,还是做一个比较吧,毕竟它们都很抽象(233). ...