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
PreparedStatementobject outperforms theStatementobject. 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/