java - 如何在Java命名参数jdbc模板批量更新插入查询中映射具有特殊字符的列?

标签 java mysql spring-jdbc jdbctemplate

我正在尝试将自定义列数据从 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/

相关文章:

java - JUnit 5 如何从嵌套测试类中获取父测试实例

java - Java多线程环境下访问数据库

mysql - 如何使用 Spring Jdbctemplate.update(String sql, obj...args) 获取插入的 id

C# MySqlDataAdapter 不更新数据库中的数据

java - Spring JdbcTemplate.update() 没有更新行

java - ElasticSearch Java API 查询并返回单列而不是整个 json 文档

Java JPanel 不会出现在 Linux 中的 JFrame 中

java - “如何删除 sqlite 数据库中正确的 ListView 项目

mysql - 使用 MySQL 的 ASP.NET MVC Identity EF

php - 页面仅在登录后才可访问