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