何时使用 Statement 而不是 Prepared Statement?

9

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


4
除了DDL语句和其他没有参数的语句,几乎没有必要使用普通语句。 - Joachim Sauer
1
可能是Statement和PreparedStatement之间的区别的重复问题。 - BalusC
2个回答

10

我认为Statement常用于没有参数的查询,但是为什么不能使用PreparedStatements呢?

这种说法并不准确。PreparedStatements适用于INSERT、UPDATE和DELETE语句,这些语句返回ResultSet或更新计数。正如Joachim所指出的那样,它们在DDL语句和调用存储过程时也不起作用(这不是两个类之间的区别)。至于没有绑定参数的查询,PreparedStatements可能比Statements更好(见下文)。

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

长期而言,对于单个连接的扩展使用,PreparedStatements会更快。虽然PreparedStatements必须编译,这需要一些时间(实际上并不多,所以不要将其视为缺点),但编译版本基本上保存了对数据库中SQL执行计划的引用。一旦编译完成,PreparedStatement将存储在特定于连接的缓存中,以便可以重复使用编译版本以提高性能。如果您正在使用JDBC批处理操作,则使用PreparedStatements会使批处理的执行比使用纯Statement对象更快,因为如果数据库需要这样做,则计划可能需要一次又一次地准备。


FYI,典型查询的大部分工作是解析语句,而不是检索数据。如果您多次使用相同的语句,则PreparedStatements会更快。 - Bohemian
是的,在跨一个execute、executeUpdate或executeQuery调用中解析和执行之间进行比较时,如果你有足够大的语句缓存,对于一个使用频率很高的数据库来说,预编译语句基本上是能够让你在多个调用之间获得性能提升的。 - Vineet Reynolds

3

这取决于您的需求。

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

此外,可以使用PreparedStatement避免SQL注入。

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

阅读下面的文章以了解“Statement与PreparedStatement”


不。只有在使用绑定参数来进行查询时,才能避免SQL注入。如果没有使用绑定参数,即使使用了PreparedStatement,仍然可能存在SQL注入的风险。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接