如何在 Java namedparameterjdbctemplate batchupdate 插入查询中映射具有特殊字符的列?

How to map columns with special characters in Java namedparameterjdbctemplate batchupdate insert query?

我正在尝试将自定义列数据从 sa360 提取到 MySQL 数据库中。所以我有一个名称为 Blended KPI 85/10/5 的列。所以我也将列名保存在数据库中 Blended 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

希望这对您有所帮助。干杯!