`
immortal2512
  • 浏览: 44013 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PrepareStatement和Statement的区别(SQL执行优化)

    博客分类:
  • java
SQL 
阅读更多

看下面两段程序片断:

Code Fragment 1:
String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);

Code Fragment 2:
PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();


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

补充:

1. 数据库在执行sql语句的时候如果使用PreparedStatement语句会有一点优势:因为数据库会   PreparedStatement 语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用,则建议采用StatemenStatement不会对sql进行预编译。

2. 另外使用PrepareStatement还有一个好处,不用对传入的字符串进行转义。

3.PreparedStatement 能有效防止Sql注入攻击,速度较快,但失于灵活.

分享到:
评论

相关推荐

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。

    MySQL prepare语句的SQL语法

    MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] …]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_...

    通过SQL Server Profiler来监视分析死锁

    NULL 博文链接:https://beijingwo2008.iteye.com/blog/1851542

    解决oracle 驱动bug: preparestatement ArrayIndexOutOfBounds

    In Oracle Metalink (Oracle's support site - Note ID 736273.1) I found that this is a bug in JDBC adapter (version 10.2.0.0.0 to 11.1...at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)

    MySQL中预处理语句prepare、execute与deallocate的使用教程

    MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT,我习惯称其为【预处理语句】,其用法十分简单,下面话不多说,来一起看看详细的介绍吧。 示例代码 PREPARE stmt_name FROM preparable_stmt ...

    Spring Data JDBC与JDBC的区别

    JDBC规范  ... PrepareStatement:预编译语句,性能更好  CallableStatement:调用存储过程  ResultSet:结果集,封装了多条记录  JDBC数据库连接池/Connection Pool  DBCP:apache tomcat内置  

    JAVA连接FileMaker完整工程

    JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker ... prepareStatement = con.prepareStatement(insertSQL); b = prepareStatement.execute();

    踩踩踩JDBC六大步骤

    PrepareStatement: conn.prepareStatement(String sql); CallableStatement: conn.prepareCall(String sql); 4)执行sql语句 stmt.execute(sql); stmt.executeUpdate(sql); stmt.executeQuery(sql); pstmt.execute*...

    MySQL数据库

    statement = connection.prepareStatement(sql); for (int i = 0; i ; i++) { statement.setString(1, "name"+i); statement.setString(2, "admin"+i); //添加到批量操作 statement.addBatch(); if(i ==0){ ...

    多渠道打包android

    android 多渠道打包,把渠道文件放入channel.txt 就行

    微软内部资料-SQL性能优化3

    An intent lock indicates that SQL Server wants to acquire a shared (S) lock or exclusive (X) lock on some of the resources lower down in the hierarchy. For example, a shared intent lock placed at the ...

    java业务层框架开发ibatis(java源码)

    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null;} public CallableStatement prepareCall...

    简单财务管理系统 java sql 数据库

    pStmt=conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return pStmt; } public static void closePstmt(Statement pstmt){ try { pstmt.close(); pstmt=null; } catch ...

    java数据库封装类

    pstmt = conn.prepareStatement(sql, autoGenereatedKeys); } } catch (SQLException e) { e.printStackTrace(); } return pstmt; } public static Statement getStatement(Connection conn) { ...

    DBConnection.java

    PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql); preStmt.executeUpdate(); preStmt.close(); db.close();//关闭连接 i = 1; // System.out.println("数据插入成功,sql...

    采用JDBC进行数据库分页查询

    一次只从数据库中查询最大maxCount条记录 ... PreparedStatement pstat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //最大查询到第几条记录.........

    MVC模式的实现的增删改查

    PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, name); pstmt.setString(2, phone); pstmt.setString(3, address); pstmt.executeUpdate(); } public void ...

    数据库增删改查的源代码

    非常实用的数据库增删改查的源代码; DB.java ... import java.sql.Connection;... ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; }

    Java WEB访问数据库

    preparedstatement ps = connection.preparestatement(sql); ps.setint(1,id); ps.setstring(2,name); resultset rs = ps.executequery(); 使用preparedstatement的另一个优点是字符串不是动态创建的。下面是一个...

    sqlengine:通过接口调用直接查询数据库

    ①添加SQL至sqltable②通过URL进入服务③根据参数中的sql_code查询sqltable,缩小接口范围④根据其他参数匹配sql⑤将占位符替换,组装sql⑥执行sql已基本解决:防止SQL注入问题,实现类似PrepareStatement的预编译...

Global site tag (gtag.js) - Google Analytics