什么时候使用Statement over Prepared Statement?

时间:2011-06-14 12:51:37

标签: java database jdbc

何时使用语句而不是预处理语句。我假设语句用于没有参数的查询,但为什么不使用预准备语句?对于没有参数的查询,哪一个更快。

2 个答案:

答案 0 :(得分:10)

  

我认为语句用于没有参数的查询,但为什么不使用预处理语句?

那甚至不是很接近。 PreparedStatements用于返回ResultSet或更新计数的INSERT,UPDATE和DELETE语句。它们不适用于Joachim所指出的DDL语句,它们也不适用于调用应该使用CallableStatement的存储过程(这不是两个类之间的差异)。就没有绑定参数的查询而言,PreparedStatements可能比语句更好(见下文)。

  

对于没有参数的查询,哪一个更快。

从长期来看,PreparedStatements将变得更快,而在单个连接中延长使用时间。这是因为,虽然必须编译PreparedStatements,这需要一些时间(这确实不是很多,所以不要把它看作是一个缺点),编译后的版本本质上是对SQL执行计划的引用。数据库。编译后,PreparedStatement存储在特定于连接的缓存中,以便可以重用已编译的版本以实现性能提升。如果您正在使用JDBC批处理操作,那么使用PreparedStatements将比使用普通Statement对象更快地执行批处理,如果数据库必须这样做,计划可能必须一次又一次地准备。

答案 1 :(得分:4)

这取决于您的要求。

如果您的SQL语句在循环中运行或经常使用不同的参数,则PreparedStatement是最佳候选者,因为它正在进行预编译并缓存此参数化SQL查询的执行计划。每次从同一个PreparedStatement对象运行时,它都将使用缓存的执行计划并提供更好的性能。

使用PreparedStatement也可以避免SQL注入。

但是,如果您确定只运行一次SQL查询,有时Statement将是最佳候选者,因为当您创建PreparedStatement对象时,有时它会进行额外的db调用,如果驱动程序支持预编译,则方法Connection.prepareStatement(java.lang.String)将将语句发送到数据库以进行预编译。

阅读以下文章,了解“声明与准备好的声明”