Java中PreparedStatement和Statement区别
1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法
execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替
Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一、代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
- stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例
- perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
- perstmt.setString(1,var1);
- perstmt.setString(2,var2);
- perstmt.setString(3,var3);
- perstmt.setString(4,var4);
- perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.
二、PreparedStatement 尽最大可能提高性能.
语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.
当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.
三、最重要的一点是极大地提高了安全性.
即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?
select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;
有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.
上面的几个原因,还不足让你在任何时候都使用PreparedStatement吗?
原文地址:http://blog.sina.com.cn/s/blog_77eba18f01019csh.html
Java中PreparedStatement和Statement区别相关推荐
- Java中PreparedStatement和Statement的用法区别
Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈 1. PreparedStatement接口继承Sta ...
- java中PreparedStatement和Statement详细讲解
java中PreparedStatement和Statement详细讲解 大家都知道PreparedStatement对象可以防止sql注入,而Statement不能防止sql注入,那么大家知道为什么 ...
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array
java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...
- 面试必问一:Java 中 == 和 equals 的区别你知道吗
面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...
- preparedStatement和Statement区别
原文:https://blog.csdn.net/xuebing1995/article/details/72235380 一.概念 PreparedStatement是用来执行SQL查询语句的API ...
- java中Array和ArrayList区别
2019独角兽企业重金招聘Python工程师标准>>> 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array". 2)Array([] ...
- Java中“==”和equals()的区别
有人经常弄不清楚"=="和equals()的区别在哪里,可以认真看下这篇文章,然后你亲自敲下代码,试试. java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 ...
- Java中string与String区别_JAVA中String与StringBuffer的区别
JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...
- java中_null和“”的区别详解
null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...
最新文章
- oracle取消180天过期,Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题...
- [翻译]Chameleon介绍(3) : 列表控件
- 中国茶叶行业投资策略分析预测及发展发展规划咨询报告2022年版
- USB转串口 FT232/PL2303/CH340 比较
- [蓝桥杯][算法训练VIP]乘积最大(动态规划)
- 祖父元素_帮助祖父母建立Skype帐户的UX经验教训
- SpringBoot项目去除druid监控的底部广告
- 算法:线性时间选择_机器学习必修课!scikit-learn 支持向量机算法库使用小结
- mongodb 的命令操作(转)
- 需要氪金吗_《死或生6》染发也需要氪金,海外玩家吐槽官方吃相太难看
- 超文本标记语言HTML
- nacos加载多配置集
- 密钥管理系统研究(一)
- vc 判断哪个按键 被按下 消息 按键 状态
- 《编译与反编译技术》—第3章3.1语 法 分 析
- android studio出现,Android studio 出现缺少sdk的情况,如何解决?
- 微信小程序wx.createInnerAudioContext使用方法
- 时间管理办法,如何对项目进行规划提高效率?
- 青海行--(7月28日)凯旋归程
- 如何使用ssh来连接windows