哪个更快? 声明或PreparedStatement

通常,在网络中可以找到这样的代码:

private static final String SQL = "SELECT * FROM table_name"; .... 

并且对于此SQL查询使用PreparedStatement。 为什么?
据我所知,PreparedStatement花时间预编译SQL语句。 事实certificate,Statement比PreparedStatement更快。 或者我错了?

当您必须使用不同的数据多次运行相同的语句时,准备语句要快得多。 这是因为SQL只会validation一次查询,而如果您只使用一个语句,它将每次validation查询。

使用PreparedStatements的另一个好处是避免引起SQL注入漏洞 – 尽管在您的情况下您的查询非常简单,但您没有遇到过。

对于您的查询,运行预准备语句与语句之间的区别可能是微不足道的。

编辑:在回复下面的评论时,您需要仔细查看DAO类,看看它在做什么。 例如,每次调用该方法时,它都会重新创建预准备语句,那么您将失去使用预准备语句的任何好处。

你想要实现的是你的持久层的封装,这样它们就不会特别调用MySQL或Postgres或你正在使用的任何东西,同时利用预处理语句之类的性能和安全性优势。 要做到这一点,您需要依赖Java自己的对象,如PreparedStatement。

我个人会构建自己的DAO类来进行CRUD操作,使用下面的Hibernate和Java Persistence API来封装它,并且应该使用预准备语句来获得安全性。 如果你有一个特定的用例来进行重复操作,那么我倾向于将它包装在它自己的对象中。

Hibernate可以配置为使用您通过XML文件使用的任何数据库供应商,因此它提供了持久层的非常巧妙的封装。 但是,要做到这一点,这是一个相当复杂的产品!

大多数时候查询并不像你的例子那么简单。 如果查询有任何变化,即编译时未知的任何参数,则必须使用PreparedStatement来避免SQL注入漏洞。 这胜过任何性能问题。 如果PreparedStatement和Statement之间存在任何差异,那么它将高度依赖于所讨论的特定JDBC驱动程序,并且大多数情况下,与进入数据库,执行实际查询和获取结果的成本相比,惩罚可以忽略不计。

这里不考虑更快。 解析sql通常只是整体执行的一小部分。 查看更多信息我们何时应该使用PreparedStatement而不是Statement?

根据我的知识, PreparedStatement比声明快得多。 这里有一些原因,为什么预备声明比声明更快,请阅读更多细节。
JDBC API提供与数据库连接的function。 然后我们尝试使用statement和preparedstatement执行查询。
执行查询有四个步骤。

解析sql查询。
编译此查询。
优化数据采集路径。
执行查询。

当我们不需要多次执行查询时,Statement接口是合适的。

语句接口的缺点。 黑客可以轻松破解数据。 就像假设我们有一个查询,其中有用户名和密码是参数,你可以给出正确的参数是username=’abc@example.com’和密码=’abc123’实际上这是最新的但黑客可以做用户名=’abc @ example.com’或’1’= 1,密码=”表示您可以成功登录。 所以这在Statement中可能发生。
每当我们从数据库中获取数据时,sql都会生效。

所以Java有针对上述问题的解决方案,即PreparedStatement。 该界面具有许多优点。 preparedstatement的主要优点是sql不是每次都validation查询。 这样你就可以快速得到结果。 请阅读以下准备陈述的更多优点。

1)我们可以使用setter方法安全地提供查询参数的值。 2)它会阻止SQL注入,因为它会自动转义特殊字符。 3)当我们使用上面的语句时,每次执行四个步骤但是当我们使用PreparedStatement时,只执行最后一步,所以这比语句更快。