如何通过','使用带'作为前缀和后缀的流来加入列表元素

Vin*_*ati 8 java java-8 java-stream

我有一个插入语句,如下所示

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); 
Run Code Online (Sandbox Code Playgroud)

我可以轻松地将COLUMNS设置为不需要引号但是对于值,我的SQL失败并且抱怨上面的代码缺少引号.

所以,我试过了

 String values = list.stream()
.collect(Collectors.joining("','"));
Run Code Online (Sandbox Code Playgroud)

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

 values = "'"+values+"'";
Run Code Online (Sandbox Code Playgroud)

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

然后预期的产出是

'rest','test','best'
Run Code Online (Sandbox Code Playgroud)

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

dev*_*per 17

你可以实际使用Collectors.joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix),你可以在这里查看API.

String values = list.stream().collect(Collectors.joining("','", "'", "'"));
Run Code Online (Sandbox Code Playgroud)


rge*_*man 6

您可以使用带有前缀和后缀参数的重载Collectors.joining.

 String values = list.stream()
    .collect(Collectors.joining("','", "'", "'"));
Run Code Online (Sandbox Code Playgroud)

这将正确地在所有值周围放置单引号,假设您的所有值都是需要语法单引号的字符串.

但是,与涉及通过连接值构建查询的所有问题一样,它使您容易受到SQL注入的影响.更安全和多功能的解决方案涉及使用PreparedStatement.值占位符是?字符,您可以使用各种setXyz方法安全地设置值.它可以防止SQL注入,并允许使用任何数据类型,而不仅仅是字符串类型.