如何在Java中命名为parameterjdbctemplate batchupdate插入查询的带有特殊字符的列映射?

时间:2019-07-24 19:12:45

标签: java mysql spring-jdbc jdbctemplate

我正在尝试将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'注册任何值

1 个答案:

答案 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

希望这会有所帮助。干杯!