zoukankan      html  css  js  c++  java
  • PreparedStatement与Statement区别

    1、PreparedStatement是预编译的,对于批量处理可以大大提高效率,也教JDBC存储过程。

    2、Statement每次执行sql语句,相关数据库都要执行sql语句的编译,PreparedStatement是预编译的,preparedstatement支持批处

    理,每一种数据库都会尽最大努力对预编译语句提供最大的性能优化,因为预编译语句有可能被重复调用,所以语句在背DB的编译

    器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只需将参数直接传入编译过的语句执行

    代码中就会得到执行

    3、代码的可读性和可维护性

    代码1

    Statement state = con.createStatement();
    		state.executeUpdate("insert into tab(id,name,address) values('"+id+"','"+name+"','"+address+"')");

    代码2

    pst = con.prepareStatement("insert into tab(id,name,address) values(?,?,?)");
    			pst.setString(1, id);
    			pst.setString(2, name);
    			pst.setString(3, address);


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

    Statement的代码要好很多。

    4、最重要的一点是安全性

    我们首先使用Statement

    ResultSet rs = state.executeQuery("select * from tb_usertable where username='"+u+"'and password='"+p+"'"); 

    如果我们把 [ ' or '1' = '1] 作为password传入进来,用户名随意,看看会有什么效果

    select * from tb_usertable where name='"+myname+"'and password='1'or'1'='1' 

    这样构造成的sql语句中因为'1' = '1'肯定成立,所以可以通过任何验证

     

    解决的办法可以使用PreparedStatement

    pst = con.prepareStatement("select * from tb_usertable where username = ? and password = ?");
    			pst.setString(1, username);
    			pst.setString(2, password);


    这样代码修改后不仅提供了效率,同时也达到了攻击的目的

     

     
  • 相关阅读:
    五种方法实现python3-随机生成10位包含数字和字母的密码
    用matplotlib中imshow()函数绘图
    MTNET 自用ios网络库开源
    移动时代软件测试团队该往哪里去?
    自己做的加速app测试流程的小工具,目前打算开放使用,想注册的朋友抓紧了,嘻嘻
    golang append
    Invalid Image Path
    xcode 插件之KSImageNamed-Xcode
    dissmiss a UISearchBar with an SearchBarController
    nginx server_name
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131439.html
Copyright © 2011-2022 走看看