2012-05-27 22 views
5

我想將exchange.body插入到我的路由條件之一的數據庫表中。在表中插入一行的Apache Camel示例

  • 是否有任何camel-jdbc組件的示例/教程插入消息正文?
  • 我可以導入SQL語句本身並將exchange.body傳遞給它嗎?

我看着http://camel.apache.org/jdbc.html的例子,但無法理解它。

這裏Spring例子令我困惑。我沒有得到它爲什麼將它設置爲SQL查詢並再次從類路徑導入一些查詢。 (這裏沒有提到插入查詢的例子)

+0

@AndrewThompson我找了幾個例子,但我無法理解他們。我無法找到任何具體的插入消息正文。 –

+0

@AndrewThompson我無法理解http://camel.apache.org/jdbc.html示例。這裏Spring例子令我困惑。我沒有得到它爲什麼將它設置爲sql查詢並再次從類路徑導入一些查詢。這裏沒有提到插入查詢的例子。

+2

jdbc組件使用body作爲SQL查詢的來源。如果你想在你的身上傳遞數據,可以考慮使用SQL(http://camel.apache.org/sql-component.html)或MyBatis(http://camel.apache。org/mybatis.html)組件 –

回答

5

在插入它之前,你可能需要對你的有效載荷進行一些重構,所以應該沒有問題可以用駱駝的任何方法來設置主體到適當的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組件用於更復雜的場景。

+3

請注意。該示例使得執行SQL注入攻擊非常容易。儘管爲了防止這種情況發生,但可能會逃脫身體內容。 –

+0

好點。我不認爲有任何傻瓜證明的方式來執行JDBC組件的SQL注入安全INSERT語句。數據必須手動清理。所以,改爲使用SQL組件的另一個原因。 OWASP和其他一些編寫代碼的用戶可以在一定程度上清除SQL語句:https://www.owasp.org/index.php/ESAPI –

+0

另一個安全的選擇是使用camel-jpa組件。它支持將行添加到表中。關於camel-jpa的另一個好處是,它還支持從表中讀取的另一面,並希望在成功時刪除記錄。 –

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')");