【问题标题】:What does pre-compiling a JDBC PreparedStatement do?预编译 JDBC PreparedStatement 有什么作用?
【发布时间】:2011-07-26 17:17:03
【问题描述】:

“预编译”语句是做什么的,因为我已经看到了 如果我用编译不报告的错误 SQL 语法编写了一个准备好的语句 有什么问题!

那么,如果预编译准备好的语句不检查语法有效性,它到底做了什么?

【问题讨论】:

  • 您认为错误在哪里?在编译时,或者当你调用prepare..(..)
  • 这取决于数据库和驱动程序。 JDBC 规范没有规定这一点。

标签: java jdbc prepared-statement


【解决方案1】:

“语句编译”是在数据库上发生的事情,有助于它更快、更有效地返回结果。如果您使用 PreparedStatement,则它允许数据库重用已编译的语句,并且不必再次执行此操作。错误的 SQL 可能会导致错误编译的数据库语句,但并非总是如此。

【讨论】:

    【解决方案2】:

    创建PreparedStatements 可能涉及也可能不涉及 SQL 语法验证甚至 DB 服务器往返,这完全取决于所使用的 JDBC 驱动程序。一些驱动程序会进行往返或验证,而另一些则不会。

    因此,在某些 JDBC 驱动程序上,PreparedStatement 并不比普通的 Statement 更“准备好”。 (换句话说:在某些 JDBC 驱动程序中,PreparedStatement 代表服务器端资源(类似于 Connection),而在其他驱动程序中,它是纯客户端构造。

    然而,一个重要的区别是PreparedStatement 将帮助您处理动态参数值,这种方式可以保证避免在尝试将值插入 SQL 语句字符串时出现的任何转义或格式问题手动并使用普通的Statement 执行它。

    该功能独立在于选择是否事先“准备”语句,因此它由每个 JDBC 驱动程序提供,即使它不执行任何其他准备步骤。

    【讨论】:

    • ... 所以我们可以说方法 prepareStatement 将 SQL 字符串发送到数据库进行编译,如果提供了数据库进行验证检查。编译好的语句后,被发送回来,并被封装到一个 PreparedStatement 对象中。
    • @xdevel:是的,一些 JDBC 驱动程序/数据库会这样做。服务器通常会发回句柄。然后,当您执行PreparedStatement 时,JDBC 驱动程序会简单地告诉服务器“使用这些参数执行语句 4:...”)。
    猜你喜欢
    • 2021-07-19
    • 2013-04-10
    • 1970-01-01
    • 2011-02-23
    • 2017-07-16
    • 2017-01-05
    • 2014-02-04
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多