如何将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 <foreach item='ot' collection='body' separator=','>(:#{ot})</foreach>"/>
注:XML中需要转义
<和>为<和>,如果是在Java DSL中编写则无需转义,直接使用<foreach>即可。
这个写法会自动遍历body中的字符串列表,生成(val1),(val2)...的格式,且每个值都通过参数绑定传递,避免SQL注入风险。
方案二:转换为Map列表+开启批量模式
- 新增一个转换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()); } }
- 更新路由流程,先转换列表格式,再开启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
相关产品推荐
相关产品推荐

