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语句并 ...
随机推荐
- Flex中宽度计算
flex 有三个属性值,分别是 flex-grow, flex-shrink, flex-basis,默认值是 0 1 auto. 发现网上详细介绍他们的文章比较少, 今天就详细说说他们,先一个一个看 ...
- web storage 离线存储
用来保存键值对数据,数据以属性的方式保存在storage实例对象上 可以用storage1.length来决定键值对的数量,但是无法决定数据的大小,storage1.remainingSpace可 ...
- 提取URL的搜索字符串中的参数
function urlArgs(){ var args = {}; var query = location.search.substring(1); if(query){ if(query.ind ...
- vue初级学习--路由router的编写(resolve的使用)
一.导语 最近在用vue仿写淘宝的商品详情页面以及加入购物车页面,若是成功了,分享给大家~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二.正文 我先用控制台创建了vue项目demo(如 ...
- ⒃bootstrap组件 轮播图 基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java多线程synchronized关键字
synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况 1.同步代码块 //锁为objsynchronized(obj){ while(true){ i ...
- Java 核心内容相关面试题【1】
1.什么是 transient 变量? transient 变量是指不会被序列化的变量. 2.什么是同步(synchronization)? 在多线程环境中,同步是指控制多个线程访问共享资源的方式.没 ...
- python 实用案例 supervisord管理进程详解
Supervisor是由python语言编写,基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能.Supervisor类似于monit,monit ...
- [转] 深刻理解Python中的元类(metaclass)
非常详细的一篇深入讲解Python中metaclass的文章,感谢伯乐在线-bigship翻译及作者,转载收藏. 本文由 伯乐在线 - bigship 翻译.未经许可,禁止转载!英文出处:stacko ...
- 小程序web-view组件
不久前微信小程序发布了web-view组件,这个消息在各个圈里引起不小的涟漪.近期正好在做小程序的项目,便研究了一下这个让大家充满期待的组件. 1,web-view这个组件是什么鬼? 官网的介绍: ...