美文网首页
PreparedStatement和Statement(数据库优

PreparedStatement和Statement(数据库优

作者: 莫小归 | 来源:发表于2018-08-02 11:18 被阅读0次

    参考:https://www.cnblogs.com/weiyi1314/p/6638483.html

    一、技术原理

    PreparedStatement接口继承Statement,并有两方面不同:
    一是PreparedStatement对象已预编译过,其执行速度要快于Statement对象。需要多次执行的SQL语句应创建为PreparedStatement对象以提高效率;
    二是SQL语句在创建时可使用IN参数及其配套的setXXX方法设置SQL语句中的参数,Statement的三种执行方法execute/executeQuery/executeUpdate不再需要执行参数。

    二、PreparedStatement的优点

    1.增强代码的可读性和可维护性

    Statement设置的SQL语句

    stmt.executeUpdate("insert into tb_name(col1,col2,col2,col4) values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
    

    PreparedStatement设置的SQL语句

      perstmt=con.prepareStatement("insertintotb_name(col1,col2,col2,col4)values(?,?,?,?)");
      perstmt.setString(1,var1);
      perstmt.setString(2,var2);
      perstmt.setString(3,var3);
      perstmt.setString(4,var4);
      perstmt.executeUpdate();
    

    2.提高运行性能

    数据库编译器在执行PreparedStatement代码后,将会缓存该语句。下次调用相同的预编译语句不再进行编译,直接将参数传入编译过的语句执行代码中。
    而Statement语句仅仅是因为传入参数不同,数据库编译器必须重新编译,如下述两条语句:

    insert into tb_name(col1,col2) values('11','22');
      insert into tb_name(col1,col2) values('11','23');
    

    3.提高数据库安全性

    恶意SQL语句:
    如下语句

    String sql="select * from tb_name where name = '" + varname + "'and passwd='" + varpasswd + "'";
    

    如果将varpassword值设为['or'1'='1],SQL语句变为

    select * from tb_name = '随意'  and passwd='' or '1'='1';
    

    因为‘1=1‘一直成立,该条语句将被执行,数据库受到SQL注入攻击。
    而使用预编译语句时,你传入的内容就不会和原语句发生任何匹配关系。只要使用PreparedStatement,就不用对传入数据进行任何过滤,也免于SQL注入的威胁。

    欲穷千里目,更上一层楼

    相关文章

      网友评论

          本文标题:PreparedStatement和Statement(数据库优

          本文链接:https://www.haomeiwen.com/subject/iqsjvftx.html