我遵循了这个问题的所有答案,以使用- Statement
(但使用SQL注入)将工作正常的旧代码更改为使用PreparedStatement
慢得多的代码的解决方案,因为对Statement.addBatch(String sql)
&的语义理解不足PreparedStatement.addBatch()
。
所以我在这里列出我的情况,以便其他人不会犯同样的错误。
我的情况是
Statement statement = connection.createStatement();
for (Object object : objectList) {
//Create a query which would be different for each object
// Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();
因此,在上面的代码中,我有成千上万个不同的查询,所有查询都添加到了同一条语句中,并且此代码的运行速度更快,因为未缓存的语句是好的,而且此代码很少在应用程序中执行。
现在要修复SQL注入,我将此代码更改为,
List<PreparedStatement> pStatements = new ArrayList<>();
for (Object object : objectList) {
//Create a query which would be different for each object
PreparedStatement pStatement =connection.prepareStatement(query);
// This query can't be added to batch because its a different query so I used list.
//Set parameter to pStatement using object
pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately
for (PreparedStatement ps : pStatements) {
ps.executeUpdate();
}
因此,您看到了,我开始创建数千个PreparedStatement
对象,然后最终无法利用批处理,因为我的方案要求- 有成千上万的UPDATE或INSERT查询,而所有这些查询恰好都不同。
修复SQL注入是必不可少的,而不会降低性能,并且我认为使用 PreparedStatement
在这种情况下。
同样,当您使用内置批处理工具时,您不必担心仅关闭一个Statement,但是使用此List方法,您需要在重用之前关闭该语句,然后重用PreparedStatement