如何通过''连接列表元素,使用带有'的流作为前缀和后缀

2022-09-04 05:26:10

我有一个如下插入语句

private final COLUMNS = "NAME,TYPE,STATUS,CATEGORY";

String values = list
    .stream()
    .collect(Collectors.joining(","));

String insertStatement = String.format("INSERT INTO ifc.documents (%s) VALUES (%s) ",COLUMNS,values); 

我可以很容易地将列作为不需要引号,但对于值,我的SQL失败并抱怨上述代码缺少引号。

所以,我试过了

 String values = list.stream()
.collect(Collectors.joining("','"));

但是这个也失败了。所以我做了一个解决方法,并添加了另一个语句前缀和后缀一个单引号,它开始工作。

 values = "'"+values+"'";

更具体地说,如果我在列表中说“休息”,“测试”和“最佳”

则预期输出为

'rest','test','best'

有人知道更好的解决方案吗?


答案 1

您可以实际使用,并且可以在此处查找API。Collectors.joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix)

String values = list.stream().collect(Collectors.joining("','", "'", "'"));

答案 2

您可以使用 Collectors.joining 的重载,它采用前缀和后缀参数。

 String values = list.stream()
    .collect(Collectors.joining("','", "'", "'"));

这将正确地将所有值放在所有值两边,假设所有值都是语法需要单引号的字符串。

但是,与涉及通过串联值来构造查询的所有问题一样,它会使您容易受到SQL注入的影响。更安全、用途更强大的解决方案涉及使用预准备语句。值占位符是字符,您可以使用各种方法来安全地设置值。它可以防止SQL注入,并允许使用任何数据类型,而不仅仅是字符串类型。?setXyz


推荐