3

当我们创建 PreparedStatement 的对象并像这样执行查询时

PreparedStatement stmt=con.prepareStatement("select * from emp");  
ResultSet rs=stmt.executeQuery(); 

如何重新编译 Statement 和预编译 PreparedStatement?

当使用存储位置数据的数据库中的 PreparedStatement 对象获取数据时?

4

2 回答 2

2

这取决于 JDBC 引擎。例如,MySQL 的 JDBC 引擎实际上通常不会创建服务器端准备好的语句(请参阅MySQL 文档这个 SO question)。在这些情况下,该PreparedStatement接口仅提供查询和参数之间的分离,以确保清晰并防止注入攻击;每次执行时PreparedStatement,它都会发送一个完整的 SQL 查询,然后 MySQL 服务器将解析、优化和执行该查询。另一方面,一些系统(包括具有正确选项的 MySQL - 请参阅第二个链接)将使用“真正的”准备好的语句,这意味着它只会被解析和优化一次。

但实际上,这就像询问内存特性java.util.List——这完全取决于实现,因此通常无法对接口做出有意义的回答。

于 2013-11-04T06:56:12.563 回答
1

在 JDBC 中总是会发生三件事:

  1)Query creation.

  2)Query compilation.

  3)Query Execution.

在 PreparedStatement 的情况下,缓存内存出现,因此不需要再次执行前两个步骤。因此,在与 Statement 相反的 PreparedStatement 的情况下,只执行最后一步。

于 2013-11-04T06:57:17.590 回答