什么时候使用Statement over Prepared Statement?

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

我假设语句用于没有参数的查询,但为什么不使用预准备语句?

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

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

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

这取决于您的要求。

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

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

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

阅读以下文章,了解“声明与PreparedStatement”

  • 使用Oracle JDBC进行Java编程