1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。

2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法
execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替
Statement.也就是说,在任何时候都不要使用Statement.

基于以下的原因:

一、代码的可读性和可维护性.

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

  1. stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例
  2. perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
  3. perstmt.setString(1,var1);
  4. perstmt.setString(2,var2);
  5. perstmt.setString(3,var3);
  6. perstmt.setString(4,var4);
  7. 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区别相关推荐

  1. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

  2. java中PreparedStatement和Statement详细讲解

    java中PreparedStatement和Statement详细讲解 大家都知道PreparedStatement对象可以防止sql注入,而Statement不能防止sql注入,那么大家知道为什么 ...

  3. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  4. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array

    java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...

  5. 面试必问一:Java 中 == 和 equals 的区别你知道吗

    面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...

  6. preparedStatement和Statement区别

    原文:https://blog.csdn.net/xuebing1995/article/details/72235380 一.概念 PreparedStatement是用来执行SQL查询语句的API ...

  7. java中Array和ArrayList区别

    2019独角兽企业重金招聘Python工程师标准>>> 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array". 2)Array([] ...

  8. Java中“==”和equals()的区别

    有人经常弄不清楚"=="和equals()的区别在哪里,可以认真看下这篇文章,然后你亲自敲下代码,试试.  java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型 ...

  9. Java中string与String区别_JAVA中String与StringBuffer的区别

    JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...

  10. java中_null和“”的区别详解

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

最新文章

  1. oracle取消180天过期,Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题...
  2. [翻译]Chameleon介绍(3) : 列表控件
  3. 中国茶叶行业投资策略分析预测及发展发展规划咨询报告2022年版
  4. USB转串口 FT232/PL2303/CH340 比较
  5. [蓝桥杯][算法训练VIP]乘积最大(动态规划)
  6. 祖父元素_帮助祖父母建立Skype帐户的UX经验教训
  7. SpringBoot项目去除druid监控的底部广告
  8. 算法:线性时间选择_机器学习必修课!scikit-learn 支持向量机算法库使用小结
  9. mongodb 的命令操作(转)
  10. 需要氪金吗_《死或生6》染发也需要氪金,海外玩家吐槽官方吃相太难看
  11. 超文本标记语言HTML
  12. nacos加载多配置集
  13. 密钥管理系统研究(一)
  14. vc 判断哪个按键 被按下 消息 按键 状态
  15. 《编译与反编译技术》—第3章3.1语 法 分 析
  16. android studio出现,Android studio 出现缺少sdk的情况,如何解决?
  17. 微信小程序wx.createInnerAudioContext使用方法
  18. 时间管理办法,如何对项目进行规划提高效率?
  19. 青海行--(7月28日)凯旋归程
  20. 如何使用ssh来连接windows

热门文章

  1. 1月16日新经济智库大会聚焦数字经济,议程、直播全收藏
  2. 监控hdfs坏块脚本
  3. ASP.NET中 CompareValidator(比较验证)的使用
  4. Socket.io 的 emit
  5. protocol buffer安装及使用(非常详细)
  6. 一封来自老男孩的学生的辞职信!
  7. 当我们点击一个文本域在IE下会发生的事件
  8. 浪涌保护器ant120_浪涌保护器测试流程
  9. c语言A 100 开头地址,C语言库函数_-_A开头
  10. css控制td比内容宽5px_CSS从零开始——布局