首先来说一下连接了数据库之后执行的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注入,安全性好。

Java的Statement、PreparedStatement、PreparedStatement + 批处理 的区别的更多相关文章

  1. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  2. java.sql.preparedstatement和java.sql.statement的区别

    本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ...

  3. [转] JDBC中的Statement和PreparedStatement的区别

    以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume ...

  4. Statement和PreparedStatement之间的区别

    Statement和PreparedStatement之间的区别: 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement ...

  5. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  6. Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值

    1 Statement和PreparedStatement的特点   a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录   b)对于创建和 ...

  7. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  8. Statement与PreparedStatement的区别

    Statement与PreparedStatement的区别   PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Pr ...

  9. JDBC与Statement和PreparedStatement的区别

    一.先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入 ...

随机推荐

  1. 从头说catalan数及笔试面试里那些相关的问题 (转)

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11938973. 声明:版权所有,转载请注明出处,谢谢 ...

  2. MYSQL 表中汉字写入或字段赋值时乱码情况排误

    -- 当改动字段值.或是直接写入时,汉字变成乱码情况 .[可注意一下数据库名,记得改动] -- 当字符顺序对汉字不兼容时,可能直接导致乱码情况发生. 最好做到库.表.字段(字符类型)排序规则是否一致 ...

  3. C#.NET常见问题(FAQ)-如何引用定义好的dll文件

    1 添加引用,找到dll文件   2 引用类的名称空间,生成类的实例,调用类的方法,测试OK.     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...

  4. JavaScript 之 回调函数的返回值给全局变量赋值问题

    jQuery 中,会遇到$.get(url,data,callback,type) 或 $.post(url,data,callback,type) 返回值给全局变量赋值的问题: 例如: <sc ...

  5. UIScrollView 图片循环滚动

    1:假如有6个图片:那个,Scrollview的大小加 7 个图片的大小 2: //ImageScrollView; UIScrollView *imageScroll = [[UIScrollVie ...

  6. HDU 4620 Fruit Ninja Extreme 暴搜

    题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...

  7. 设计模式——门面模式(Facade)

    要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 门面模式是 ...

  8. H5实现的手机摇一摇

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. Hat’s Words(字典树)

    Problem Description A hat's word is a word in the dictionary that is the concatenation of exactly tw ...

  10. aop 注解 开启spring自带的事务

    一些基本知识 可以 http://jinnianshilongnian.iteye.com/blog/1415606 serviceImpl.java package cn.us.service.im ...