如何解析Map<String,Object>生成字符串值带单引号的SQL键值拼接串
实现方案
不需要引入任何额外依赖,直接基于JDK原生能力即可完成Map到目标格式字符串的解析,适配UPDATE语句SET子句的构造需求。
核心逻辑
- 遍历Map的每一组键值对
- 按值类型做格式化处理:字符串类型的值用单引号包裹,数值类型(Integer、Double等)直接转换为字符串拼接
- 单组键值对固定拼接为
key = 格式化后的值格式 - 多组键值对之间用逗号分隔,推荐使用
StringBuilder做字符串拼接,性能优于直接用+累加
修正后的接口实现代码
原有update方法的拼接逻辑存在缺失,没有将等号、处理后的值和对应键绑定,修正后的完整代码如下:
@Transactional @PutMapping(value = "/config/test/{tableName}/{schemaName}/{id}") public Map<String, Object> updateValue(@RequestBody Map<String, Object> values, @PathVariable("tableName") String tableName, @PathVariable("schemaName") String schemaName, @PathVariable("id") String id) { StringBuilder setSegment = new StringBuilder(); boolean firstPair = true; for (Map.Entry<String, Object> entry : values.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // 非首组键值对前拼接逗号分隔符 if (!firstPair) { setSegment.append(","); } firstPair = false; // 拼接键和等号 setSegment.append(key).append(" = "); // 按值类型做格式化 if (value instanceof String) { setSegment.append("'").append(value).append("'"); } else if (value instanceof Integer || value instanceof Double) { setSegment.append(value); } // 如需支持Long、Boolean、时间等其他类型,可在此处追加类型判断分支 } // 兼容字符串类型ID的场景,非数字ID自动包裹单引号避免SQL语法错误 String idCondition = id.matches("\\d+") ? id : "'" + id + "'"; final String sql = String.format("UPDATE %s.%s SET %s WHERE ID = %s", schemaName, tableName, setSegment, idCondition); final Query query = em.createNativeQuery(sql); query.executeUpdate(); return values; }
注意事项
直接拼接原生SQL存在SQL注入安全隐患,如果后续业务对安全性要求较高,可以直接使用JPA自带的原生SQL参数绑定能力实现,同样不需要引入额外依赖。
内容的提问来源于stack exchange,提问作者Doncarlito87
相关产品推荐
相关产品推荐

