首先来说一下连接了数据库之后执行的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. RS开发值提示默认为当前月

    在报表的开发过程中,按月查询数据,但是由于数据仓库中涉及多年历史数据,而用户最关心的却是最近的数据,针对这个情况.当用户第一次点击报表想看到的就是当前月的数据,那么如何去做呢? 下面用一个小例子来实战 ...

  2. easyui combotree不让父级选中

    easyui combotree不让父级选中? <ul id="combotree"></ul> $(function () { $("#comb ...

  3. Solr打分出错

    solr支持给某Field打分,在验证的过程的过程中出现错误:ERROR: [doc=likehua] cannot set an index-time boost, unindexed or nor ...

  4. Android实现固定头部信息,挤压动画(相似通讯录)

    半年前,那时候我还是个大四的学生,每天都在找工作度过,想去北京体验一下蚁族生活,奋然离开了济南,哎...在济南我们学校还是数得着的好学校,去了北京就什么都不是了,一切的辛酸仅仅有自己知道,那时候的我仅 ...

  5. 以Settings.APPLICATION_DEVELOPMENT_SETTINGS打开开发人员面板出错总结

    近期遇到了一个问题,感觉须要记录一下. 要打开开发人员面板,之前的代码例如以下: Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVE ...

  6. shell综合

    既可恶又不得不注意的地方: 1.if 与[ 之间必须有空格, 2.[ ]与判断条件之间也必须有空格, 3.]与; 之间不能有空格, 4.变量赋值的时候,等号两边不能有空格, 调试:sh -x xxx. ...

  7. Discuz常见小问题-如何修改UCenter创始人密码

    http://faq.comsenz.com/viewnews-925 参照上面这个帖子,把tools.php下载下来并放到uc_server目录下,打开文件,找到第10行设置一个初始工具箱密码 ht ...

  8. ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation

    开启super权限: 1. update user set Super_priv=‘Y’ where User=‘root’2. flush privileges

  9. eclipse 图片预览插件

      eclipse 图片预览插件 CreateTime--2018年4月22日22:59:55 Author:Marydon 下载地址:eclipse 图片预览插件 将插件文件夹直接拷贝到eclips ...

  10. tarfile模块可以方操作tar归档文件

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python自带的tarfile模块可以方便读取tar归档文件 #http://www.open-open. ...