我正在尝试将sa360中的自定义列数据提取到MySQL DB中。因此,我有一列名为Blended KPI 85/10/5
。因此,我还将列名也保存在数据库中混合KPI 85/10/5 。
因此,首先将数据存储在CSV文件中,然后从CSV文件中读取记录并将其捕获到List<Map<String, Object>>
中,然后将这些记录存储到数据库中。由于我有5000多个记录,因此我在使用批处理插入。因此,我遇到了一些问题语法类型错误。请查看以下代码段和错误。
我确实尝试处理转义字符,但没有成功。
每日记录中的值:
{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()]));
执行时,出现以下错误:
没有为SQL参数'Blended_KPI_85'提供任何值:没有为键'Blended_KPI_85'注册任何值
答案 0 :(得分:0)
您不能将/
,(
,)
的字符用作占位符名称,因为它们是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
希望这会有所帮助。干杯!