什么时候在PreparedStatement上使用Statement更好?

时间:2017-08-31 01:42:32

标签: java sql jdbc

关于何时以及为什么在JDBC中使用PreparedStatement优于Statement而不是相反的问题,有很多Q& A?换句话说,何时以及为何使用Statement优于PreparedStament?我很难找到一个更好的用例。我已经看到一些评论似乎表明在某些情况下表现更好,但很快就会回到PreparedStatement。那么,什么时候使用StatementPreparedStatement更好?

如:

connection.createStatement().executeQuery(sql);

VS

PreparedStatement preparedStatement = connection.preparedStatement(sql);
preparedStatement.execute();

需要额外的代码。

3 个答案:

答案 0 :(得分:0)

您的问题已在此链接中得到明确解答:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

简而言之,我可以说PreparedStatementStatement都基于他们所使用的案例是好的。例如,如果您只想获取表A中的所有行,则可以使用String sql = "SELECT name, age, address FROM table-A"; Statement stat = connection.createStatement(sql); ResultSet rs = stat.executeQuery(); ,例如:

PreparedStatement

但是,如果在使用where where条件的情况下使用SQL,最好使用String sql = "SELECT name, age, address FROM table-A WHERE name=? AND age=?"; PreparedStatement stat = connection.prepareStatement(sql); stat.setString(1, "johny"); stat.setInt(2, 25); ResultSet rs = stat.executeQuery(); ,例如:

SELECT...RANK OVER

答案 1 :(得分:0)

在大多数现实生活中,很少有createStatement优于preparedStatement的情况。

我相信几乎每个人都知道使用预备语句的好处,仅举几例:

  • 不易受SQL注入攻击
  • 更好的性能,以避免SQL使用不同的参数解析相同的SQL

当您使用预准备语句时,大多数这些好处来自重用相同的语句,并单独设置参数(而不是嵌入查询本身)。

使用createStatement()的唯一好处(我知道)是您可以使用相同的语句对象来执行不同的SQL,而在使用预准备语句时,您需要为每个查询创建PrepredStatement。

在现实生活中,这很少有意义。但是,当您开发一个允许用户输入任意查询的应用程序时(这意味着您无法单独设置参数),那么使用预准备语句没有明显的好处。然后,如果这样的应用程序要使用不同的查询字符串查询很多次(例如,您正在构建SQL客户端),那么执行createStatement一次,并重用Statement对象来执行不同的查询可以通过较少的对象分配获得一些(边际)性能增益。

答案 2 :(得分:-2)

要从表中选择所有行,可以使用statement。如果您的要求是从表中获取特定数据,则使用语句是个坏主意。因为您根据用户输入检索数据。如果使用Statement,则where条件将成为查询的一部分的用户输入。如下所示。

String selectQuery = "Select * from table where condition="+user_input;

如果用户输入类似于"某事或5 = 5",那么呈现的查询字符串就像,

Select * from table where condition=something or 5=5 

5 = 5将始终返回true,因此返回该特定表中的所有行。在处理敏感数据存储的表时,这非常危险。

但是如果你使用预准备语句,输入将不是查询的一部分。它只是一个字符串。使用preparedStatement呈现的查询字符串将类似于

Select * from table where condition=everything_user_posted_as_a_single_value.

所以现在条件=' some_condition或5 = 5'。它不会被视为查询的一部分,而是将该参数的所有内容视为单个值。

如果您需要保护数据并且从不关心性能,则可以自由使用PreparedStatements。说到安全性,PreparedStatement优于Statement。因此,如果您认为您的查询不会受到SQL注入的影响,您可以立即使用语句。