首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >replaceAll对setString

replaceAll对setString
EN

Stack Overflow用户
提问于 2014-08-21 13:40:36
回答 2查看 123关注 0票数 1

我有一份预先准备好的声明,上面有六点?在里面。在任何地方,它都将被相同的字符串取代。

以下两种方法中哪一种更可取:

代码语言:javascript
复制
pstmt = con.prepareStatement(QUERY.replaceAll("\\?", id));

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 13:42:14

第二种,第一种可能容易受到SQL注入的影响。特别是当id是一个String时(它看起来就在这里)。

代码语言:javascript
复制
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(s),所以上面的操作应该更好。第一个例子并非如此。

票数 6
EN

Stack Overflow用户

发布于 2014-08-21 13:43:36

第二个。

除了难以识别的错误(例如用it替换字符串文本中的问号)之外,每次发送第一个查询时都需要对第一个查询进行分析和优化。这将使查询计划的缓存受到几乎相同的计划的污染,这些计划仅在ID的确切值上存在差异。每次解析查询都会增加额外的成本,使缓存变得毫无用处。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25427880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档