replaceAll vs setString

时间:2014-08-21 13:40:37

标签: java string jdbc

我准备好了六个'''的陈述在里面。并且在所有地方它将被相同的字符串替换。

首选以下哪两种方法:

pstmt = con.prepareStatement(QUERY.replaceAll("\\?", id));

OR

pstmt = con.prepareStatement(QUERY));
pstmt.setString(1, id);
pstmt.setString(2, id);
pstmt.setString(3, id);
pstmt.setString(4, id);
pstmt.setString(5, id);
pstmt.setString(6, id);

2 个答案:

答案 0 :(得分:6)

第二个,第一个可能容易受到SQL注入攻击。特别是当(看起来像这里)时idString

pstmt = con.prepareStatement(QUERY));
pstmt.setString(1, id);
pstmt.setString(2, id);
pstmt.setString(3, id);
pstmt.setString(4, id);
pstmt.setString(5, id);
pstmt.setString(6, id);

此外,上述应该执行得更好,因为语句查询缓存可能会为不同的id重用该语句。第一个例子不是这样。

答案 1 :(得分:6)

第二个。

除了难以发现的错误之外,例如在带有ID的字符串文字中替换问号,每次发送时都需要解析和优化第一个查询。这会污染查询计划的缓存,使用几乎相同的计划,这些计划仅在ID的确切值上有所不同。每次解析查询都会产生额外的成本,使得缓存无用。

第二个将准备一次,每次执行时都会重复使用它的查询计划。