我有一个准备好的陈述,带有六个“?”在里面。并在所有位置将其替换为相同的字符串。
以下两种方法中的哪一种是首选:
pstmt = con.prepareStatement(QUERY.replaceAll("\\?", id));
要么
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);
最佳答案
第二个,第一个很容易受到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,因此上述方法应具有更好的性能。对于第一个示例,情况并非如此。
关于java - replaceAll与setString,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25427880/