【问题标题】:Apache Camel example to insert a row in a tableApache Camel 示例在表中插入一行
【发布时间】:2012-06-02 10:01:55
【问题描述】:

我想将 exchange.body 插入到数据库表中,以满足我的路线条件之一。

  • 有没有camel-jdbc组件插入消息体的例子/教程?
  • 我可以导入 SQL 语句本身并将 exchange.body 传递给它吗?

我看了http://camel.apache.org/jdbc.html 的例子,但看不懂。

这里的 Spring 示例让我感到困惑。我不明白为什么将正文设置为 SQL 查询并再次从类路径中导入一些查询。 (这里没有提到插入查询示例。)

【问题讨论】:

  • @AndrewThompson 我找了几个例子,但我无法理解它们。我找不到任何特定于插入消息正文的内容。
  • @AndrewThompson 我无法理解camel.apache.org/jdbc.html 示例。这里的 Spring 示例让我感到困惑。我不明白为什么将正文设置为 sql 查询并再次从类路径中导入一些查询。这里没有提到插入查询示例。
  • jdbc 组件使用 body 作为 SQL 查询的来源。如果要在正文中传递数据,请考虑使用 SQL (camel.apache.org/sql-component.html) 或 MyBatis (camel.apache.org/mybatis.html) 组件

标签: java jdbc apache-camel


【解决方案1】:

无论如何,您可能需要在插入有效负载之前对其进行一些重组,因此使用 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) 并使用一些初始数据(sql/init.sql 文件)填充它来测试 JDBC 组件。这部分实际上并不是核心 jdbc 组件的一部分,而只是在文档中启动和运行示例,而无需配置 DB 服务器和设置 JDBC 连接属性。

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

【讨论】:

  • 请小心。该示例使执行 SQL 注入攻击变得非常容易。不过为了防止这种情况,可能可以转义正文内容。
  • 好点。我认为没有任何万无一失的方法可以使用 JDBC 组件执行 SQL 注入安全 INSERT 语句。必须以某种方式手动清理数据。因此,另一个使用 SQL 组件的理由。 OWASP 和其他一些人在一定程度上编写了清理 SQL 语句的代码:owasp.org/index.php/ESAPI
  • 另一个安全的选择是使用 camel-jpa 组件。它支持开箱即用地向表中添加行。 camel-jpa 的另一个好处是它还支持从表中读取并希望在成功时删除记录的另一端。
【解决方案2】:

如果您想使用相同的语句插入(仅更改参数)- 使用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')");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2017-03-20
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多