通常情况下,在网络中可以发现这样的代码:哪个更快? Statement或PreparedStatement
private static final String SQL = "SELECT * FROM table_name";
....
,并为这个SQL查询中使用PreparedStatement的。为什么?
据我所知,PreparedStatement花时间预编译SQL语句。事实证明,这样Statement比PreparedStatement更快。或者我错了?
通常情况下,在网络中可以发现这样的代码:哪个更快? Statement或PreparedStatement
private static final String SQL = "SELECT * FROM table_name";
....
,并为这个SQL查询中使用PreparedStatement的。为什么?
据我所知,PreparedStatement花时间预编译SQL语句。事实证明,这样Statement比PreparedStatement更快。或者我错了?
当您不得不多次运行相同的语句并使用不同的数据时,准备好的语句要快得多。那是因为SQL只会验证一次查询,而如果你只是使用一条语句,它会每次验证查询。
使用PreparedStatements的其他好处是避免造成SQL注入漏洞 - 尽管在您的情况下您的查询非常简单,您还没有遇到过。
对于您的查询,运行预处理语句与语句之间的区别可能可以忽略不计。
编辑:在回应您的评论下面,你需要仔细看看DAO类,看看它在做什么。例如,如果每次调用该方法时重新创建预准备语句,那么您将失去使用预准备语句的好处。
你想要实现的是持久层的封装,以便它们没有特定的调用MySQL或Postgres或者你正在使用的任何东西,并且同时利用类似事件的性能和安全性好处准备好的陈述为此,您需要依赖Java自己的对象,如PreparedStatement。
我个人会建立我自己的DAO类来做CRUD操作,使用下面的Hibernate和Java Persistence API来封装它,并且应该使用预先准备好的语句来提高安全性。如果你有重复操作的特定用例,那么我会倾向于将它包装在它自己的对象中。
可以将Hibernate配置为通过XML文件使用您正在使用的任何数据库供应商,因此它提供了对持久层的真正封装。但是,获得正确的产品是相当复杂的产品!
大多数时间查询并不像您的示例那么简单。如果查询有任何变化,即编译时未知的任何参数,则必须使用PreparedStatement来避免SQL注入漏洞。这胜过任何性能问题。 如果PreparedStatement和Statement之间有任何区别,它将高度依赖于特定的JDBC驱动程序,并且大多数情况下,与进入数据库,执行实际查询和获取结果的成本相比,惩罚可以忽略不计。
是的,你说的是明显的事情。但在这个查询中,我们不需要设置任何参数,并基于此 - 我们不会有SQL注入。 – Ifozest 2012-03-03 17:32:43
所以是的,正如其他人所说,如果没有参数并且只执行一次,那么执行Statement而不是PreparedStatement可能会稍微快一点,但我宁愿保持一致并始终使用PreparedStatement。 – 2012-03-03 17:37:20
速度不是这里的考虑因素。解析sql通常只是整体执行的一小部分。查看更多内容When should we use a PreparedStatement instead of a Statement?
由于根据我的知识PreparedStatement比声明要快得多。这里有一些原因,为什么预备陈述更快然后陈述请阅读更多的细节。
JDBC API提供了与数据库连接的功能。然后我们尝试使用语句和准备语句来执行查询。
执行查询有四个步骤。
解析sql查询。
编译此查询。
数据采集路径的优化。
执行查询。
声明接口适用于我们不需要多次执行查询的情况。
Statement接口的缺点。 黑客可以轻易破解数据。就像我们有一个查询,其中有用户名和密码是一个参数,你可以给出正确的参数是username='[email protected]'和密码='abc123'实际上这是当前但黑客可以做username ='abc @ example.com'或'1'= 1和密码='',这意味着您可以成功登录。这在声明中可能发生。
每当我们从数据库中获取数据时,sql都会验证。
因此,Java有解决上述问题的方法是PreparedStatement。 这个接口有很多优点。 preparedstatement的主要优点是sql不是每次都验证查询。所以你可以快速得到结果。请阅读以下更多的准备陈述的优点。
1)我们可以安全地使用setter方法提供查询参数的值。 2)它防止SQL注入,因为它会自动转义特殊字符。 3)当我们使用上面的语句时,每次都执行四个步骤但是当我们使用PreparedStatement时,只执行最后一个步骤,所以这比语句更快。
我想澄清一些事情。在我简单的webApp我有DAO类。在这个类中,我有使用preparedStatement的方法(通过ID获取一些信息)。当多次调用这个方法时,prepareStatement会预编译这个SQL查询多少次? – Ifozest 2012-03-04 18:41:32
我编辑了我的主要答案 - 这是你问题中有趣的部分。 – christophmccann 2012-03-04 18:44:36
请参阅编辑现在了解更多信息。 – christophmccann 2012-03-04 18:58:16