我正在尝试将自定义列数据从 sa360 提取到 MySQL 数据库中。所以我有一个名为 Blended KPI 85/10/5
的列。因此,我将列名称以及混合 KPI 85/10/5 保存在数据库中。
因此,首先将数据存储在 CSV 文件中,然后我从 CSV 文件中读取记录并将其捕获到 List<Map<String, Object>>
中。然后这些记录将被存储到数据库中。由于我有 5000 多条记录,因此我使用批量插入。所以我面临一些语法类型错误的问题。请查看下面的代码片段和错误。
我确实尝试过处理转义字符,但没有成功。
dailyRecords 中的值:
{account_id=2, brand_id=2, platform_id=1, campaign_id=71700000028596159, Blended_KPI_85/10/5=0.0, CPB_(85/10/5)=0.0}
代码:
String sql = "INSERT INTO campaign_table (`account_id` ,`brand_id` ,`platform_id` ,`campaign_id` , `Blended KPI 85/10/5` , `CPB (85/10/5)` ) VALUES (:account_id, :brand_id, :platform_id, :campaign_id, :Blended_KPI_85/10/5 , :CPB_(85/10/5))"
namedParameterJdbcTemplate.batchUpdate(sql, dailyRecords.toArray(new Map[dailyRecords.size()]));
执行时,我收到以下错误:
No value supplied for the SQL parameter 'Blended_KPI_85': No value registered for key 'Blended_KPI_85'
最佳答案
不能使用 /
、(
,)
字符作为占位符名称,因为它们是 SQL 语法的保留字符。一个快速的解决方法是更改 SQL 语句中占位符的名称,并更改数据中的键。
如果您的 Java 版本为 8 或更高版本,您可以借助集合流轻松修改数据中 Map
的键:
String sql = "INSERT INTO campaign_table (`account_id` ,`brand_id` ,`platform_id` ,`campaign_id` ,`Blended KPI 85/10/5` ,`CPB (85/10/5)`) VALUES (:account_id, :brand_id, :platform_id, :campaign_id, :Blended_KPI_85_10_5 , :CPB_85_10_5)"
Map[] params = dailyRecords.stream().map(m -> {
m.put("Blended_KPI_85_10_5", m.get("Blended_KPI_85/10/5"));
m.put("CPB_85_10_5", m.get("CPB_(85/10/5)"));
return m;
}).toArray(Map[]::new);
namedParameterJdbcTemplate.batchUpdate(sql, params);
请注意,我删除了这些字符并更改了 sql 语句中的占位符名称,如下所示:
:Blended_KPI_85/10/5 => :Blended_KPI_85_10_5
:CPB_(85/10/5) => :CPB_85_10_5
希望这有帮助。干杯!
关于java - 如何在Java命名参数jdbc模板批量更新插入查询中映射具有特殊字符的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57189778/