• PreparedStatement 与 Statement 的区别


      

      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
     
     
  • 相关阅读:
    《Kubernetes权威指南第2版》学习(四)kubernetes基本概念和术语
    《Kubernetes权威指南第2版》学习(三)RC学习
    HTTP 1.1 的HOST 与 虚拟IP(待续)
    HTTP 2 VS HTTP 1.1
    HTTP 的若干问题
    HTTP 协议入门(转载)
    java web 基础 json 和 javaBean转化
    java web基础学习 Forward和Redirect区别
    【雅思】金山词霸-单词学习(41-80)
    【数据库】left join(左关联)、right join(右关联)、inner join(自关联)的区别
  • 原文地址:https://www.cnblogs.com/Latiny/p/8244576.html
Copyright © 2020-2023  润新知