当我们创建 PreparedStatement 的对象并像这样执行查询时
PreparedStatement stmt=con.prepareStatement("select * from emp");
ResultSet rs=stmt.executeQuery();
如何重新编译 Statement 和预编译 PreparedStatement?
当使用存储位置数据的数据库中的 PreparedStatement 对象获取数据时?
当我们创建 PreparedStatement 的对象并像这样执行查询时
PreparedStatement stmt=con.prepareStatement("select * from emp");
ResultSet rs=stmt.executeQuery();
如何重新编译 Statement 和预编译 PreparedStatement?
当使用存储位置数据的数据库中的 PreparedStatement 对象获取数据时?
这取决于 JDBC 引擎。例如,MySQL 的 JDBC 引擎实际上通常不会创建服务器端准备好的语句(请参阅MySQL 文档和这个 SO question)。在这些情况下,该PreparedStatement
接口仅提供查询和参数之间的分离,以确保清晰并防止注入攻击;每次执行时PreparedStatement
,它都会发送一个完整的 SQL 查询,然后 MySQL 服务器将解析、优化和执行该查询。另一方面,一些系统(包括具有正确选项的 MySQL - 请参阅第二个链接)将使用“真正的”准备好的语句,这意味着它只会被解析和优化一次。
但实际上,这就像询问内存特性java.util.List
——这完全取决于实现,因此通常无法对接口做出有意义的回答。
在 JDBC 中总是会发生三件事:
1)Query creation.
2)Query compilation.
3)Query Execution.
在 PreparedStatement 的情况下,缓存内存出现,因此不需要再次执行前两个步骤。因此,在与 Statement 相反的 PreparedStatement 的情况下,只执行最后一步。