返回的Java方法可以在SQL IN语句中使用的String

时间:2014-06-08 06:21:43

标签: java sql

我有一个逗号分隔的字符串,我需要转换它才能在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语句中不起作用。我需要纠正这种方法,我需要帮助。感谢。

4 个答案:

答案 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;
}