• Java的Statement、PreparedStatement、PreparedStatement + 批处理 的区别


    首先来说一下连接了数据库之后执行的sql语句:通常连接了数据库之后,我们就会获得statement 类的对象或者是他的子类的对象(PreparedStatement类),通过这个对象我们就可以利用它提供的方法来操纵数据库了。

    Statement提供了三种方法来执行sql语句:

    1,execute:可以执行在任何的sql语句,但是比较麻烦,通常我们不会选择这一种的但是如果在不清楚SQL语句的类型时,那只能使用execute来执行sql语句了。

    2,executeUpdata:主要用于执行DML与DDL语句,执行DML语句返回的是受SQL语句影响的行数,执行DDL语句返回0。

    3,executeQuery:只能执行查询语句。执行后返回代表查询结果的ResultSet这个集合对象。

    下面说一下重点要说的内容:

    Statement与PreparedStatement的对象都可以用来执行sql语句但是在许多方面我们还是使用的PreparedStatement类的对象比较多,PreparedStatement是Statement的子类,他可以预编译sql语句,预编译后的sql语句储存在PreparedStatement对象中,然后使用PreparedStatement对象可以多次高效的执行sql语句。

    使用PreparedStatement类的对象也有上述的三个执行sql语句的方法,但是这个三个方法无需参数。具体的过程对比请见:http://www.cnblogs.com/duhuo/p/4276226.html

    具体如下:

    1.使用Statement对象

    使用范围:当执行相似SQL(结构相同,具体值不同)语句的次数比较少

    优点:语法简单

    缺点:采用硬编码效率低,安全性较差。

    原理:硬编码,每次执行时相似SQL都会进行编译  

    示例执行过程:

     public void exec(Connection conn){
    
            try {
    
                    Long beginTime = System.currentTimeMillis();
    
                    conn.setAutoCommit(false);//设置手动提交
    
                    Statement st = conn.createStatement();
    
                    for(int i=0;i<10000;i++){
    
                       String sql="insert into t1(id) values ("+i+")";
    
                       st.executeUpdate(sql);
    
                    }
    
                    Long endTime = System.currentTimeMillis();
    
                    System.out.println("Statement用时:"+(endTime-beginTime)/1000+"秒");//计算时间
    
                    st.close();
    
                   conn.close();
    
            } catch (SQLException e) {             
    
                      e.printStackTrace();
    
            }
    
       }

    执行时间:Statement用时:31

    2.预编译PreparedStatement

    使用范围:当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作..)语句一样,只是具体的值不一样,被称为动态SQL

    优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)

    缺点: 执行非相似SQL语句时,速度较慢。

    原理:相似SQL只编译一次,减少编译次数

    事例执行过程:

     public void exec2(Connection conn){
    
             try {
    
                    Long beginTime = System.currentTimeMillis();
    
                    conn.setAutoCommit(false);//手动提交
    
                    PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
    
                    for(int i=0;i<10000;i++){
    
                           pst.setInt(1, i);
    
                           pst.execute();   
    
                    }
    
                    conn.commit();
    
                    Long endTime = System.currentTimeMillis();
    
                    System.out.println("Pst用时:"+(endTime-beginTime)+"秒");//计算时间
    
                    pst.close();
    
                    conn.close();
    
             } catch (SQLException e) {               
    
                      e.printStackTrace();
    
             }
    
        }

    执行时间:Pst用时:14

    3.使用PreparedStatement + 批处理

    使用范围:一次需要更新数据库表多条记录

    优点:减少和SQL引擎交互的次数,再次提高效率,相似语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)

    缺点:

    原理:批处理: 减少和SQL引擎交互的次数,一次传递给SQL引擎多条SQL。

    名词解释:

    PL/SQL引擎:在oracle中执行pl/sql代码的引擎,在执行中发现标准的sql会交给sql引擎进行处理。

    SQL引擎:执行标准sql的引擎。

    事例执行过程:

    public void exec3(Connection conn){
    
         try {
    
               conn.setAutoCommit(false);
    
               Long beginTime = System.currentTimeMillis();
    
               PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
    
                         
    
              for(int i=1;i<=10000;i++){   
    
                    pst.setInt(1, i);
    
                    pst.addBatch();//加入批处理,进行打包
    
                    if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等
    
                          pst.executeBatch();
    
                          conn.commit();
    
                          pst.clearBatch();
    
                    }//end of if
    
               }//end of for
    
               pst.executeBatch();
    
               Long endTime = System.currentTimeMillis();
    
               System.out.println("pst+batch用时:"+(endTime-beginTime)+"毫秒");
    
               pst.close();
    
               conn.close();
    
          } catch (SQLException e) {
    
                e.printStackTrace();
    
          }
    
    }

    执行时间:pst+batch用时:485毫秒

    总体上来看:

    PreparedStatement比使用Statement多了如下三个好处:

    1、PreparedStatement预编译sql语句。性能更好。

    2、PreparedStatement无需“拼接”sql语句,编译更简单。

    3、PreparedStatement可以防止SQL注入,安全性好。

  • 相关阅读:
    2021牛客暑期多校训练营5
    二分图知识点温习
    Codeforces Round #735 (Div. 2)
    牛客比赛订正(3,4)
    Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解
    关于球的相关知识
    AtCoder Beginner Contest 210题解
    P7077 [CSP-S2020] 函数调用
    偏序问题学习笔记
    P1606 [USACO07FEB]Lilypad Pond G
  • 原文地址:https://www.cnblogs.com/duhuo/p/4279194.html
Copyright © 2020-2023  润新知