创建逗号分隔字符串作为sql“IN”子句的输入

我想要一个字符串作为SQL“IN”子句的输入,其中我想要一个用逗号分隔的字符串列表

你可以使用番石榴的Joiner

 Joiner.on(",").join(inputsList); 

您应该使用PreparedStatement,以便在必要时自动转义字符串,并保护您免受sql注入。

首先,为列表中的每个元素生成带有标记的语句。 例如:

 select id, name from users where name in (?, ?, ?) 

然后循环遍历列表并在语句中设置值。

请查看此问题以获取详细信息:

使用JDBC参数化IN子句的最佳方法是什么?

这样做的工作:

 public String separateByComma(List input) { // check for valid input!! public StringBuilder sb = new StringBuilder(input.get(0)); for (int i = 1; i < input.size(); i++) sb.append(",").append(input.get(i)); return sb.toString(); } 

顺便说一句 - 你可能需要用双引号括起来的字符串:

 public String separateByCommaForSQL(List input) { // check for valid input!! public StringBuilder sb = new StringBuilder("\""+input.get(0)+ "\""); for (int i = 1; i < input.size(); i++) sb.append(",\"").append(input.get(i)).append("\""); return sb.toString(); } 

您可以使用org.apache.commons.lang.StringUtils.join()方法,或自己实现连接操作。

正如其他答案所指出的,有许多助手可以用来加入。

我想补充一点:

请注意,大多数DBMS都可以像这样连接的值的数量上限。 我们之前遇到过这种情况; 如果你不确定你将永远不会超过几十个值,你必须确保不超过这个限制(每个DBMS都有所不同,有时甚至是可配置的)。

限制通常来自对SQL语句总大小的限制,或者对逗号分隔列表中值的显式限制。

如果遇到此问题,另一种方法是为值列表创建临时(或永久)表,并将值插入此表。 然后,您可以使用WHERE xxx IN (SELECT column FROM helpertable)而不是将列表放入SQL语句中。 这避免了最大长度问题; 如果您需要重新使用列表,它也可能更快。 如果你只需要一次列表,那就更麻烦(也可能更慢)……

一个不寻常的解决方案:如果Strings在ArrayListLinkedListjava.util.AbstractCollection子类)中,则调用toString() ,返回“ [e1,e2,e3 …] ”。 然后你可以处理字符串。