Java 什么时候使用报表比使用准备好的报表更好?

Java 什么时候使用报表比使用准备好的报表更好?,java,sql,jdbc,Java,Sql,Jdbc,关于何时以及为什么在JDBC中使用PreparedStatement优于Statement的问题有很多,但不是相反的问题?换句话说,何时以及为什么在preparedstatement上使用语句更好?我正在努力寻找一个更好的用例。我看到一些评论似乎表明,在某些情况下,它的性能更好,但它很快又回到了PreparedStatement。那么什么时候使用语句比使用PreparedStatement更好呢 例如: connection.createStatement().executeQuery(sql)

关于何时以及为什么在JDBC中使用
PreparedStatement
优于
Statement
的问题有很多,但不是相反的问题?换句话说,何时以及为什么在
preparedstatement
上使用
语句更好?我正在努力寻找一个更好的用例。我看到一些评论似乎表明,在某些情况下,它的性能更好,但它很快又回到了
PreparedStatement
。那么什么时候使用
语句比使用
PreparedStatement
更好呢

例如:

connection.createStatement().executeQuery(sql);
vs


使用任何需要的附加代码。

此链接清楚地回答了您的问题:

简而言之,我可以说,
Statement
PreparedStatement
都是好的,这是基于它们使用的情况。例如,如果您只想获取表A中的所有行,可以使用
语句
,例如:

String sql = "SELECT name, age, address FROM table-A";
Statement stat = connection.createStatement(sql);
ResultSet rs = stat.executeQuery();
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();
但是,如果使用where条件使用SQL,则最好使用
PreparedStatement
,例如:

String sql = "SELECT name, age, address FROM table-A";
Statement stat = connection.createStatement(sql);
ResultSet rs = stat.executeQuery();
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();

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

String selectQuery = "Select * from table where condition="+user_input;
这里,如果用户输入类似于“something or 5=5”,那么呈现的查询字符串将类似于

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

但是,如果您使用prepared语句,那么输入将不是查询的一部分。它只是一根线。使用preparedStatement呈现的查询字符串如下所示

Select * from table where condition=everything_user_posted_as_a_single_value.
所以现在条件='some_条件或5=5'。它不会被视为查询的一部分,而是将该参数的所有内容视为单个值


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

在大多数实际情况下,
createStatement
很少比
preparedStatement
更好

我相信几乎每个人都知道使用事先准备好的声明的好处,仅举几个例子:

  • 不易受sql注入攻击
  • 性能更好,可以避免使用不同参数解析同一个SQL
这些好处大多来自于重用同一语句,以及在使用prepared语句时分别设置参数(而不是嵌入查询本身)

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


在现实生活中,这很少有意义。然而,当您开发一个允许用户输入任意查询的应用程序时(这意味着您不能单独设置参数),那么使用prepared语句并没有明显的好处。然后,如果这样的应用程序要多次使用不同的查询字符串进行查询(例如,您正在构建一个SQL客户机),那么执行一次
createStatement
,并重用
Statement
对象来执行不同的查询可能会为您带来一些好处(边际)通过更少的对象分配提高性能。

扩展了
语句
。因此,每当您使用
PreparedStatement
时,您使用的是
语句
语句
是一个接口,而不是一个实现。使用
Statement
时,您得到的实现不支持位置参数,因此无法提供
PreparedStatement
所具有的安全性。这是两者之间的一个主要区别。什么时候买动物比买狗好?这是我的问题,有没有更好的时候?如果没有,那它为什么会在那里呢?@StephaneGrenier再次阅读了评论
PreparedStatement
is-a
Statement
Statement
是一个接口。因此,当您使用
PreparedStatement
时,您使用的是
语句
,说“使用
语句
”实际上没有意义。你必须清楚你所说的“使用陈述”是什么意思——它并没有回答问题。OP显然知道编制报表的好处。他想知道在什么情况下使用普通的
语句。query(xxxx)
比使用预先准备好的语句要好。因此,如果我正确地阅读了您的答案,那么您基本上是在说您只想进行连接的时间。createStatement是指您是否对表进行全选?这似乎非常罕见,因此我的问题是,为什么会出现在API中?对于通过java运行时传递给DBMS的每个SQL语法,java都会先编译它,然后执行此语法。通过使用
语句
,若我们从表中请求100行,java将编译100次。不像
Statement
PreparedStatement
编译一次,然后对于每一行,java使用预编译语法,然后将其传递给DBMS。