You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Bean返回的字符串列表传入SQL组件执行批量插入?

解决Camel SQL组件批量插入字符串列表的问题

问题原因

你当前的SQL写法:#body会把List<String>中的每个元素当作独立参数传入,但SQL语句只声明了一个参数位置,导致参数数量不匹配报错。要实现INSERT ... VALUES (val1),(val2)...的批量插入,需要调整参数传递和SQL语句的写法。

方案一:直接用SQL foreach构造多值插入语句

修改SQL组件的URI,利用Camel SQL支持的foreach语法生成多值子句:

<to uri="sql:insert into dbo.table_example (OT) VALUES &lt;foreach item='ot' collection='body' separator=','&gt;(:#{ot})&lt;/foreach&gt;"/>

注:XML中需要转义<和>为&lt;和&gt;,如果是在Java DSL中编写则无需转义,直接使用<foreach>即可。

这个写法会自动遍历body中的字符串列表,生成(val1),(val2)...的格式,且每个值都通过参数绑定传递,避免SQL注入风险。

方案二:转换为Map列表+开启批量模式

  1. 新增一个转换Bean,把List<String>转为包含字段映射的List<Map<String, Object>>:
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OTConverter {
    public List<Map<String, Object>> toMapList(List<String> ots) {
        return ots.stream()
                  .map(ot -> Collections.singletonMap("ot", ot))
                  .collect(Collectors.toList());
    }
}
  1. 更新路由流程,先转换列表格式,再开启SQL组件的批量模式:
<bean ref="fot" method="getOTs(${body})"/>
<bean ref="otConverter" method="toMapList(${body})"/>
<to uri="sql:insert into dbo.table_example (OT) VALUES (:#ot)?batch=true"/>

开启batch=true后,Camel会自动将Map列表转换为批量插入语句,同时优化数据库交互性能。

注意事项

  • 确保使用的数据库(如SQL Server)支持多值INSERT语法
  • 优先使用参数绑定的方式(如:#ot),避免直接拼接字符串引发SQL注入
  • 若使用低版本Camel,需确认是否支持foreach语法,建议升级到较新的稳定版本

内容的提问来源于stack exchange,提问作者Pouissante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:05:29