我有一个逗号分隔的字符串,我需要转换它才能在SQL IN语句中使用它,例如SELECT * FROM table WHERE filedvalue IN(conversion)
以下是我到目前为止提出的方法。为Parameter parameter is GBL075,GBL008
public String paramconverter(String parameter)
{
String conversion="";
String newstring="";
String[] parts = parameter.split(",");
for(String part : parts)
{
newstring = newstring.concat("'"+part+"',");
}
conversion = new StringBuilder().append(newstring).toString();
int ind = conversion.lastIndexOf(",");
conversion = new StringBuilder(conversion).delete(ind,ind+1).toString();
System.out.println(conversion);
return conversion;
}
然而,当我读取控制台输出时,我得到以下变量转换结果
' GBL075'' GBL008' ' GBL075'' GBL008'
这显然在sql语句中不起作用。我需要纠正这种方法,我需要帮助。感谢。
答案 0 :(得分:0)
在Java 8中,他们添加了StringJoiner类:
StringJoiner joiner = new StringJoiner(", ");
joiner.add("foo");
joiner.add("bar");
joiner.add("baz");
String joined = joiner.toString(); // "foo, bar, baz"
检查this question,它们提供不同的第三方库
答案 1 :(得分:0)
SQL变量包含单个值,而不是值列表。
某些数据库允许传递列表(例如作为自定义数据类型),但这种情况很常见且通常很复杂。
通常的解决方案是构建一个没有参数的SQL字符串。这感觉不对,但没有更好的解决方案。例如:
sql = "select * from tbl where name in ("
for(int i = 0; i < array.length; i++)
{
if (i != 0)
sql += ", ";
sql += "'" + StringEscapeUtils.escapeSql(name) + "'";
}
sql += ");"
请注意escapeSql
的使用,以便代码适用于带有单引号的名称。
答案 2 :(得分:0)
解决问题的典型方法(将是初学者Java开发人员的解决方案):
String newstring="";
String[] parts = parameter.split(",");
for(String part : parts)
{
if (!newstring.isEmpty()) newstring += ",";
newstring += "'" + part + "'";
}
System.out.println(newstring);
return newstring;
有更有效的方法。当然,如果你不使用预准备语句,你应该逃避单引号。
如果你问我,我会至少这样做(有点中级,但添加参数验证/ NPE检查,你会在很多代码中看到它):
//this class should be put for later re-use in the code
public class StringUtils {
public static String[] escapeAndQuote(String[] arr) {
String[] ret = new String[arr.length];
for (int i=0; i<arr.length; i++) {
ret[i] = "'" + arr[i].replace("'","''")+"'";
}
return ret;
}
public static String join(String delim, String[] arr) {
if (arr.length == 0) return "";
StringBuilder ret = new StringBuilder(arr[0]);
for (int i=1; i<arr.length; i++) {
ret.append(delim).append(arr[i]);
}
return ret.toString();
}
}
...
//this is how you use it
public String paramconverter(String parameter)
{
return StringUtils.join(",",StringUtils.escapeAndQuote(parameter.split(",")));
}
更好的方法是做一个monadic包装器a-la jQuery,但只有你用Strings做很多东西才能得到回报。
最后,但并非最不重要的是,如果您知道只有2个值,则参数化SQL查询(预准备语句)是一种方法。
答案 3 :(得分:0)
public String paramconverter(String parameter){
StringTokenizer token = new StringTokenizer(parameter,",");
StringBuilder builder = new StringBuilder();
while(token.hasNext()){
builder.append("'");
builder.append(token.next());
builder.append("'");
if(builder.hasNext()){
builder.append(",");
}
}
return builder.toString();
}
OR
public String paramconverter(String parameter){
String res = ("'"+parameter+"'").replace(",","','");
return res;
}