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