我准备好了六个'''的陈述在里面。并且在所有地方它将被相同的字符串替换。
首选以下哪两种方法:
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);
答案 0 :(得分:6)
第二个,第一个可能容易受到SQL注入攻击。特别是当(看起来像这里)时id
是String
。
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的确切值上有所不同。每次解析查询都会产生额外的成本,使得缓存无用。
第二个将准备一次,每次执行时都会重复使用它的查询计划。