PrepareStatement与Statement的主要区别

来源:互联网 发布:cs1.5枪械数据 编辑:程序博客网 时间:2024/05/23 07:24

正常对比:

1.
PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需要更改其中变量的值,便可重新执行SQL语句。选择 PreParedStatement对象与否,在于相同的句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量不同,如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出她预编译的优越性。

2.prepareStatement是把你的sql语句预先“编译”好,每次只替换定义的变量, 

他的作用是减少与数据库的通信量,从而加快执行速度,主要用在循环执行SQL语句

3.

prepareStatement已经予编译,速度比Statement快些 
prepareStatement解决有关特殊字符插入到数据库的问题。如(',",),?)

4.

Statement   ─   由方法   createStatement   所创建。Statement   对象用于发送简单的   SQL   语句。  
PreparedStatement   ─   由方法   prepareStatement   所创建。PreparedStatement   对象用于发送带有一个或多个输入参数(   IN   参数)的   SQL   语句。PreparedStatement   拥有一组方法,用于设置   IN   参数的值。执行语句时,这些   IN   参数将被送到数据库中。PreparedStatement   的实例扩展了   Statement   ,因此它们都包括了   Statement   的方法。PreparedStatement   对象有可能比   Statement   对象的效率更高,因为它已被预编译过并存放在那以供将来使用。  
CallableStatement   ─   由方法   prepareCall   所创建。CallableStatement   对象用于执行   SQL   储存程序   ─   一组可通过名称来调用(就象函数的调用那样)的   SQL   语句。CallableStatement   对象从   PreparedStatement   中继承了用于处理   IN   参数的方法,而且还增加了用于处理   OUT   参数和   INOUT   参数的方法。  
  
以下所列提供的方法可以快速决定应用哪个   Connection   方法来创建不同类型的   SQL   语句:  
  
      createStatement   方法用于:   
   
简单的   SQL   语句(不带参数)  
  
prepareStatement   方法用于:  
  
带一个或多个   IN   参数的   SQL   语句  
   
经常被执行的简单   SQL   语句   
  
prepareCall   方法用于:  
调用已储存过程

Statement用法


stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");


prepareStatement用法

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);
perstmt.executeUpdate();

很多人就用第二种方法!


Statement没有设置缓存,prepareStatement有,并且一次性可以插入n个数据


利用PreparedStatement对象提高数据库的总体效率      

  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象



详细对比:

我对PreparedStatement和Statement的性能测试了一下:
 测试代码如下:

java 代码
 
  1. Connection con = getOraConnection();  
  2. String sql = "select id,name from test where id=";  
  3. String tempSql;  
  4. int count = 1000;  
  5. long time = System.currentTimeMillis();  
  6. for (int i = 0; i < count; i++) {  
  7.     Statement st = con.createStatement();  
  8.     tempSql=sql+(int) (Math.random() * 100);  
  9.     st.executeQuery(tempSql);  
  10.     st.close();  
  11. }  
  12. System.out.println("st cost:" + (System.currentTimeMillis() - time));  
  13.   
  14. String psql = "select id,name from test where id=?";  
  15. time = System.currentTimeMillis();  
  16. for (int i = 0; i < count; i++) {  
  17.     int id=(int) (Math.random() * 100);  
  18.     PreparedStatement pst = con.prepareStatement(psql);  
  19.     pst.setBigDecimal(1new BigDecimal(id));  
  20.     pst.executeQuery();  
  21.     pst.close();  
  22. }  
  23.   
  24. System.out.println("pst cost:" + (System.currentTimeMillis() - time));  
  25.   
  26. con.close();  


test表很简单,id int,name varchar(50).
对几种数据库和相应驱动程序进行测试,结果如下(ms):
oracle:        1235    1109
MSSQL2000(JTDS):391    453
MSSQL2000(MS):    453    640
Mysql5:        391    891
PostgreSQL8.1:   1078    1047


结论:

1.PreparedStatement多用于批处理效率很高,Statement多用于顺序执行

2.单并发情况下,oracle--PostgreSQL--MSSQL--MySQL的性能依次增高;
3.MySQL不支持PreparedStatement特性,已在其驱动程序的文档中证实,所以在MySQL里使用 PreparedStatement的性能尤其低,可以比Statement慢一倍以上。

4.MSSQL2000下,PreparedStatement比Statement慢;

5.Oracle,PostgreSQL对它的支持最好,使用PreparedStatement性能比Statement高。


原创粉丝点击