关于何时以及为什么在JDBC中使用PreparedStatement
优于Statement
而不是相反的问题,有很多Q& A?换句话说,何时以及为何使用Statement
优于PreparedStament
?我很难找到一个更好的用例。我已经看到一些评论似乎表明在某些情况下表现更好,但很快就会回到PreparedStatement
。那么,什么时候使用Statement
比PreparedStatement
更好?
如:
connection.createStatement().executeQuery(sql);
VS
PreparedStatement preparedStatement = connection.preparedStatement(sql);
preparedStatement.execute();
需要额外的代码。
答案 0 :(得分:0)
您的问题已在此链接中得到明确解答:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
简而言之,我可以说PreparedStatement
和Statement
都基于他们所使用的案例是好的。例如,如果您只想获取表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
的情况。
我相信几乎每个人都知道使用预备语句的好处,仅举几例:
当您使用预准备语句时,大多数这些好处来自重用相同的语句,并单独设置参数(而不是嵌入查询本身)。
使用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注入的影响,您可以立即使用语句。