zoukankan      html  css  js  c++  java
  • JDBC数据更新

    在JDBC中通常用Statement类的对象实现对数据库的更新(增、删、查、改)操作

     
                //1、获取数据库连接
                connection = getConnection();
     
                //2、准备sql语句
                String sql = null;
                // sql = "INSERT INTO custom(NAME,BIRTH) VALUES('No.3','1999-9-9')";
                //sql ="DELETE FROM custom where ID = 3";
                sql = "UPDATE custom set name = 'abc' where ID = 2";
                //3、获取Statement对象
                statement = connection.createStatement();
     
                //4、执行sql更新语句,statement.executeUpdate()只能执行insert、delete、update语句,不能执行select语句
                statement.executeUpdate(sql);
                
    //5、执行sql查询语句,ResultSet 类的对象用来保存查询结果
    sql="select * from custom"; ResultSet resultSet = statement.executeQuery(sql);

      

    PreparedStatement和Statement

    1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象;
    2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数;
    3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替;

    一般选用PreparedStatement原因如下:

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

    使用statement:

    stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例
    

    使用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);//setXXX()方法根据不同数据类型有不同选择
    perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
    

      

    二、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注入

    即使到目前为止,仍有一些人连基本的恶义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,;等做费尽心机的判断和过虑.

  • 相关阅读:
    Vue中 el-table大数据量加载,不分页,节省内存的性能优化
    http请求中Content-Type以及qs.stringify的使用
    setTimeout用法(Event Loop简介、for循环中应用、vue中应用)
    Vue中关于图片路径配置的填坑日记
    WebSocket
    Vue中mockjs的使用
    Vue 作用域插槽slot slot-scope v-slot
    Windows Server 2003搭建邮件服务器
    Exchange 2010的部署
    Exchange 2010 详细安装步骤
  • 原文地址:https://www.cnblogs.com/wfy680/p/14971563.html
Copyright © 2011-2022 走看看