Apache Camel示例在表中插入一行

时间:2012-05-27 22:50:00

标签: java jdbc apache-camel

我想将exchange.body插入到数据库表中,以获取我的路由条件之一。

  • 是否有任何camel-jdbc组件的示例/教程来插入邮件正文?
  • 我可以自己导入SQL语句并将exchange.body传递给它吗?

我查看http://camel.apache.org/jdbc.html示例,但无法理解。

这里的Spring例子对我来说很困惑。我没理解为什么它将主体设置为SQL查询并再次从类路径导入一些查询。 (这里没有提到插入查询示例。)

2 个答案:

答案 0 :(得分:6)

如果您想使用相同的声明进行插入(仅更改参数) - 请使用SQL component

如果要使用任意SQL语句插入组件 - 请使用JDBC component

SQL组件用法:

from("direct:start").to("sql:insert into table foo (c1, c1) values ('#','#')");

com.google.common.collect.Lists;
producerTemplate.sendBody("direct:start", Lists.newArrayList("value1","value2"));

JDBC组件用法:

from("direct:start").to("jdbc:dataSource");

producerTemplate.sendBody("direct:start", "insert into table foo (c1, c1) values ('value1','value2')");

答案 1 :(得分:5)

您可能需要在插入之前对有效负载进行一些重组,因此使用Camel中的任何方法进行转换以将主体设置为适当的INSERT语句可能没有问题。

重要的是您的传入消息具有哪种有效负载结构。在基本情况下 - 它是一个字符串 - 它应该相当简单

// In a Java bean/processor before the JDBC endpoint.
// Update: make sure to sanitize the payload from SQL injections if it contains user inputs or external data not generated by trusted sources.
exchange.getIn().setBody("INSERT INTO MYTABLE VALUES('" + exchange.getIn().getBody(String.class) + "', 'fixedValue', 1.0, 42)");

如果您的消息包含复杂的数据结构,此代码当然会更复杂,但它与常规应用程序生成SQL查询的方式几乎相同。

您要引用的类路径示例

 <jdbc:embedded-database id="testdb" type="DERBY">
        <jdbc:script location="classpath:sql/init.sql"/>
 </jdbc:embedded-database>

简单地说明如何通过启动嵌入式数据库服务器(Apache Derby)来测试JDBC组件,并使用一些初始数据(sql / init.sql文件)填充它。这部分并不是核心jdbc组件的一部分,而只是在文档中,无需配置数据库服务器和设置JDBC连接属性即可启动并运行示例。

也就是说,您可能希望将SQL组件用于更复杂的场景。