首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

PreparedStatement与Statement的差别

2012-11-07 
PreparedStatement与Statement的区别PreparedStatement jdk的解释是不带targetSqlType参数的setObject()方

PreparedStatement与Statement的区别

PreparedStatement jdk的解释是



不带targetSqlType参数的setObject()方法

public void setObject(int parameterIndex, Object parameterObj)throws SQLException {if (parameterObj == null) {setNull(parameterIndex, java.sql.Types.OTHER);} else {if (parameterObj instanceof Byte) {setInt(parameterIndex, ((Byte) parameterObj).intValue());} else if (parameterObj instanceof String) {setString(parameterIndex, (String) parameterObj);} else if (parameterObj instanceof BigDecimal) {setBigDecimal(parameterIndex, (BigDecimal) parameterObj);} else if (parameterObj instanceof Short) {setShort(parameterIndex, ((Short) parameterObj).shortValue());} else if (parameterObj instanceof Integer) {setInt(parameterIndex, ((Integer) parameterObj).intValue());} else if (parameterObj instanceof Long) {setLong(parameterIndex, ((Long) parameterObj).longValue());} else if (parameterObj instanceof Float) {setFloat(parameterIndex, ((Float) parameterObj).floatValue());} else if (parameterObj instanceof Double) {setDouble(parameterIndex, ((Double) parameterObj).doubleValue());} else if (parameterObj instanceof byte[]) {setBytes(parameterIndex, (byte[]) parameterObj);} else if (parameterObj instanceof java.sql.Date) {setDate(parameterIndex, (java.sql.Date) parameterObj);} else if (parameterObj instanceof Time) {setTime(parameterIndex, (Time) parameterObj);} else if (parameterObj instanceof Timestamp) {setTimestamp(parameterIndex, (Timestamp) parameterObj);} else if (parameterObj instanceof Boolean) {setBoolean(parameterIndex, ((Boolean) parameterObj).booleanValue());} else if (parameterObj instanceof InputStream) {setBinaryStream(parameterIndex, (InputStream) parameterObj, -1);} else if (parameterObj instanceof java.sql.Blob) {setBlob(parameterIndex, (java.sql.Blob) parameterObj);} else if (parameterObj instanceof java.sql.Clob) {setClob(parameterIndex, (java.sql.Clob) parameterObj);} else if (parameterObj instanceof java.util.Date) {setTimestamp(parameterIndex, new Timestamp(((java.util.Date) parameterObj).getTime()));} else if (parameterObj instanceof BigInteger) {setString(parameterIndex, parameterObj.toString());} else {setSerializableObject(parameterIndex, parameterObj);}}}


所以大家不要为了省事,而使用不带targetSqlType参数的setObject()方法。

Statement是PreparedStatement的父接口,
主要特点是:
1、易于调试;
2、不进行预编译操作,减少了进行预编译的开销。单次运行PreparedStatement要比Statement要慢一些
这里有个对比:http://www.onjava.com/lpt/a/1480

?

Table 19-3: OCI driver timings (in milliseconds)

Inserts

Statement

PreparedStatement

1

10

113

1,000

2,804

1,412

?

The important thing to notice about the graph is that it's not until about 65 inserts that the PreparedStatement object outperforms the Statement object. 65 inserts

?

综上:

Statement和PreparedStatement,都有其优缺点,但总体而言,强烈建议使用Statement的同学改为使用PreparedStatement,如果希望调试方便,再加个p6spy等包做辅助,看到的sql语句效果更好。毕竟许多应用中,都要考安全性、大用户量时候的性能问题。像hibernate、toplink这种jpa在使用jdbc的时候,如果数据库端支持,都很统一的使用了PreparedStatement。

如:oracle.toplink.essentials.internal.databaseaccess.DatabasePlatform类。

?

?

顺便再讲一下,程序员写出来的sql语句是最值得去关注的,一条效率差的sql语句,足以毁掉整个应用。

1 楼 metadmin 2009-03-30   建议使用PreparedStatment。 SQL可以做为类常量定义在类里面,而不是方法里面。

这样,可以在类的常量定义部分,直接看到SQL语句,直接审查、直接修改。而不用到各个方法里面找。

比如:
public class Test {
public static final String SELECT_SQL="select * from tablea";

public Collection getAll() {
      pstmt=conn.prepareStatement( SELECT-SQL );
}
}

------------------
权限管理圈子欢迎您:
http://accessmanager.group.iteye.com/

热点排行