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

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

  3、在JDBC应用中,大部分情况应该以PreparedStatement代替 Statement,只有极少数情况下考虑Statement(不考虑安全性,只做少次查询)。
 
  
基于以下的原因:
1 代码的可读性和可维护性
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说都比直接用Statement的代码要方便:
 
Statement插入数据
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
 
PreparedStatement插入数据
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 对象实例

明显第二种方法比第一种可读性与维护性要好。

 
2 PreparedStatement尽最大可能提高性能
 
Statement为一条Sql语句生成执行计划,
如果要执行两条sql语句
select colume from table where colume=1;
select colume from table where colume=2;
会生成两个执行计划
一千个查询就生成一千个执行计划!

PreparedStatement 用于使用绑定变量重用执行计划
select colume from table where colume=?;

通过set不同数据只需要生成一次执行计划,可以重用。
 
3 最重要的一点是极大地提高了安全性

看下面的一条很简单的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, delete等恶意sql代码花费大量的精力去判断和过虑。

 
转自:https://www.cnblogs.com/zhizhuwang/p/3513372.html
 
 

最新文章

  1. 【汉字】转【pīnyīn】
  2. Windows7系统禁用USB和启用USB方法
  3. 建索引让SQL飞起来
  4. Codeforces Round #534 (Div. 1)
  5. sql 查询所有作业的详情
  6. C#操作DataReader类
  7. 计算机网络原理和OSI模型与TCP模型
  8. 对象本田CRV
  9. springboot Autowired BeanNotOfRequiredTypeException
  10. [React] 04 - Intro: mongoDB becomes popular
  11. iptables报错:Couldn't load target `accept':/lib64/iptables/libipt_accept.so: cannot open shared object file: No such file or directory
  12. Linux 下socket通信终极指南(附TCP、UDP完整代码)
  13. centos中安装tomcat6
  14. linux更新系统
  15. 第六章 图(d)深度优先搜索
  16. P3807 【模板】卢卡斯定理
  17. Cockroachdb 三、副本设置
  18. AHOI2012 信号塔 | 最小圆覆盖模板
  19. spring-boot-资源处理
  20. PIE SDK辐射定标

热门文章

  1. Angular之模态弹窗ui-bootstrap-modal及轻量级弹窗ngDialog
  2. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
  3. UDP Health Checks
  4. 【COCOS2DX-游戏开发之三一】之 坐标系(下) convertToNodeSpace和convertToWorldSpace
  5. docker: read tcp 192.168.7.235:36512->54.230.212.9:443: read: connection reset by peer.
  6. 15 python 初学(闭包,函数装饰器)
  7. go语言程序设计学习笔记-1
  8. 多线程爬虫爬取详情页HTML
  9. netty简单样例
  10. 从零开始搭建django前后端分离项目 系列三(实战之异步任务执行)