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)
您可以使用带有前缀和后缀参数的重载Collectors.joining
.
String values = list.stream()
.collect(Collectors.joining("','", "'", "'"));
Run Code Online (Sandbox Code Playgroud)
这将正确地在所有值周围放置单引号,假设您的所有值都是需要语法单引号的字符串.
但是,与涉及通过连接值构建查询的所有问题一样,它使您容易受到SQL注入的影响.更安全和多功能的解决方案涉及使用PreparedStatement
.值占位符是?
字符,您可以使用各种setXyz
方法安全地设置值.它可以防止SQL注入,并允许使用任何数据类型,而不仅仅是字符串类型.
归档时间: |
|
查看次数: |
2060 次 |
最近记录: |