何时使用语句而不是准备语句。我认为语句用于没有参数的查询,但为什么不使用预准备语句?对于没有参数的查询,哪一个更快。何时使用Statement over Prepared Statement?
回答
我想声明用于没有参数的查询,但为什么不使用预处理语句?
这甚至没有接近。 PreparedStatements用于返回ResultSet或更新计数的INSERT,UPDATE和DELETE语句。他们不会像Joachim指出的那样为DDL语句工作,他们也不会用于调用需要CallableStatement的存储过程(这不是两个类之间的区别)。就没有绑定参数的查询而言,PreparedStatements可能比Statements更好(见下文)。
对于没有参数的查询,哪一个更快。
从长远来看,PreparedStatements在单个连接的扩展使用中将变得更快。这是因为,尽管PreparedStatements必须被编译,这需要一些时间(这实际上并不是很多,所以不要将其看作是缺点),编译后的版本本质上持有对SQL执行计划的引用数据库。一旦编译完成,PreparedStatement就会存储在一个连接专用的缓存中,这样编译后的版本可以被重用以提高性能。如果您正在使用JDBC批处理操作,则使用PreparedStatements将使批处理的执行速度比使用简单Statement对象的速度快得多,如果数据库必须这样做,可能需要一次又一次准备计划。
FYI,*典型查询的大部分工作都在语句的解析,而不是数据检索。如果多次使用相同的语句,PreparedStatements会快很多。 – Bohemian 2011-06-14 13:17:22
是的,那就是当你在一个execute,executeUpdate或executeQuery调用的解析和执行之间进行比较时。针对大量使用的数据库,如果您有足够大的语句缓存,则预编译语句本质上可以为您提供跨多个调用的性能增益。 – 2011-06-14 13:22:49
这取决于您的要求。
如果您有一条SQL语句以循环方式运行或频繁使用不同的参数,那么PreparedStatement是最好的选择,因为它正在进行预编译并缓存此参数化SQL查询的执行计划。每次它从相同的PreparedStatement对象运行时,它将使用缓存执行计划并提供更好的性能。
也可以使用PreparedStatement避免SQL注入。
但是,如果您确定只运行一次SQL查询,有时Statement将成为自创建PreparedStatement对象以来的最佳人选,有时它会进行额外的db调用,如果驱动程序支持预编译,则方法Connection.prepareStatement(java.lang.String)将发送语句到数据库进行预编译。
阅读下面文章,了解“声明对战PreparedStatement的”
- 1. SELECT Prepared statement
- 2. SQL Studio Prepared Statement
- 3. lastInsertId()for Prepared Statement
- 4. SQLSyntaxError即使使用Prepared Statement
- 5. 使用MySQLi Prepared Statement创建用户
- 6. permisions for procedure/outfile/prepared statement
- 7. Oracle中的Java Prepared Statement catsearch
- 8. SqlInjection with prepared statement without bind variable?
- 9. Prepared Statement not working while while Statement is working with Java and Oracle
- 10. mysqli Prepared Statement in bindParam()不起作用
- 11. Prepared Statement的SQL语法错误?
- 12. Apache Ignite Cache API中的Prepared Statement支持
- 13. Prepared Statement上的executeBatch有效吗?
- 14. Commons DBUtils Oracle 11g Prepared Statement - 插入语句
- 15. SELECT语句中的Java Prepared Statement参数
- 16. PDO Prepared Statement允许执行JavaScript
- 17. 如何使用Prepared Statement with php插入到mysql
- 18. 使用MySQL的CSharp Prepared Statement不起作用
- 19. 替代在触发器中使用Prepared Statement与MySQL
- 20. 以无符号整数使用Java Prepared Statement的正确方法
- 21. 使用MySQLi Prepared Statement将多行数据输入数据库?
- 22. 使用MySQLi Prepared Statement获取行的问题
- 23. 如何使用IF..Statement
- 24. k.next statement
- 25. 如何在Spring Prepared Statement中传递Java日期
- 26. 如何在executeBatch()之前检查Prepared Statement是否有批处理?
- 27. Sprintf从Prepared Statement中取回,不起作用
- 28. return statement
- 29. Callable Statement
- 30. 使用Proc SQL和Case-statement时出错
有几乎没有一个理由使用正常的语句,可能除了DDL语句和其他PARAM少发言。 – 2011-06-14 13:00:37
[Statement and PreparedStatement之间的差异]的可能重复(http://stackoverflow.com/questions/3271249/difference-between-statement-and-preparedstatement) – BalusC 2011-06-14 13:03:58