2012-05-27 7 views
5

Rota.body'yi rotamın bir koşulu için bir veritabanı tablosuna eklemek istiyorum.Apache Camel örneği tabloya bir satır eklemek için

  • İleti gövdesi eklenecek bir deve-jdbc bileşeni öğreticisi/örneği var mı?
  • SQL deyimini kendim alabilir ve exchange.body'ye iletebilir miyim?

http://camel.apache.org/jdbc.html örneğine baktım ama anlayamadım.

İşte Bahar örneği benim için kafa karıştırıcı. Nedenini almadım, neden SQL sorgusu olarak vücudu ayarlıyor ve yine sınıf yolundan bazı sorguları içe aktarıyor. (Burada belirtilen herhangi bir ekleme sorgusu yoktur.)

+0

@AndrewThompson ben birkaç örnek aradım ama onları anlamak mümkün değilim. Mesaj gövdesini eklemek için herhangi bir spesifik bulamadım. –

+0

@AndrewThompson http://camel.apache.org/jdbc.html örneğini anlayamadım. İşte Bahar örneği benim için kafa karıştırıcı. Nedenini almadım, neden bu dosyayı sql sorgusu olarak ayarlıyor ve yine sınıf yolundan bazı sorguları içe aktarıyor. Burada belirtilen bir ekleme sorgusu örneği yok.

+2

jdbc bileşeni, bir SQL sorgusu kaynağı olarak gövdeyi kullanır. Vücudunuzdaki verileri aktarmak istiyorsanız SQL (http://camel.apache.org/sql-component.html) veya MyBatis (http: //camel.apache) kullanmayı düşünün.org/mybatis.html) bileşen –

cevap

5

Muhtemelen yerleştirmeden önce yükünüzün bir miktar yeniden yapılandırılması gerekir, bu yüzden muhtemelen gövdeyi ayarlamak için herhangi bir yöntem kullanarak bir dönüşüm yapmak için bir sorun olmamalı uygun INSERT ifadesine.

Önemli olan, gelen mesajınızın ne tür bir yük yapısına sahip olduğudur. Temel durumda - mesajınız karmaşık veri yapılarını içeren durumunda

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

, bu kod elbette daha karmaşık olacaktır

oldukça basit olmalıdır, ancak düzenli uygulama üretecektir hemen hemen aynı yolu - bir dize var SQL sorguları.

Eğer

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

atıfta olan sınıf yolu örnek Basitçe gömülü bir veritabanı sunucusu (Apache Derby) başlatarak JDBC bileşeni test ve (bazı ilk veri ile sql/init.sql bunu doldurmak için nasıl gösterir dosya). Bu bölüm, çekirdek jdbc bileşeninin bir parçası değildir, yalnızca bir DB sunucusunu yapılandırmaya ve JDBC bağlantı özelliklerini ayarlamaya gerek kalmadan bir örnek almak ve çalıştırmak için yalnızca belgelerde yer almaktadır.

Daha karmaşık senaryolar için SQL bileşenini kullanmak isteyebilirsiniz.

+3

Lütfen dikkatli olun. Örnek, bir SQL enjeksiyon saldırısı yapmak çok kolay hale getirir. Bunu önlemek için vücut içeriğinden kaçmak mümkün olabilir. –

+0

İyi nokta. Ben JDBC bileşeni ile SQL enjeksiyon güvenli INSERT ifadeleri yapmak için herhangi bir aptal kanıt yolu olduğunu düşünmüyorum. Veriler manuel olarak sterilize edilmelidir. Yani, bunun yerine SQL bileşenini kullanmak için başka bir sebep. OWASP ve diğerleri, SQL deyimlerini bir ölçüde temizlemek için bir kod yazmıştır: https://www.owasp.org/index.php/ESAPI –

+0

Bir başka güvenli seçim deve-jpa bileşenini kullanmaktır. Kutudan bir tabloya satır eklemeyi destekler. Deve-jpa ile ilgili bir başka güzel şey de, bir masadan okuduğunuz ve kayıtlardaki başarıları silmek istediğiniz diğer tarafı da desteklemesidir. –

6

numaralı ifadeyi kullanarak aynı deyim (yalnızca parametreleri değiştirerek) - SQL component'u kullanın.

rasgele SQL deyimini bileşenini kullanarak eklemek istiyorsanız JDBC component kullanın.

SQL bileşen kullanım:

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 bileşen kullanım:

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

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