2012-05-27 12 views
5

Voglio inserire exchange.body in una tabella di database per una delle condizioni del mio percorso.Esempio di Cammello Apache per inserire una riga in una tabella

  • Esiste qualche esempio/esercitazione del componente camel-jdbc per inserire il corpo del messaggio?
  • Posso importare la stessa istruzione SQL e passare exchange.body ad essa?

Ho guardato l'esempio http://camel.apache.org/jdbc.html, ma non riuscivo a capirlo.

Qui l'esempio di primavera è per me fonte di confusione. Non ho capito perché è l'impostazione del corpo come query SQL e di nuovo l'importazione di alcune query dal percorso classe. (Non vi è alcun esempio di query di inserimento menzionato.)

+0

@AndrewThompson ho cercato alcuni esempi, ma io non sono in grado di capirli. Non sono riuscito a trovare alcun specifico per l'inserimento del corpo del messaggio. –

+0

@AndrewThompson Non ho capito l'esempio http://camel.apache.org/jdbc.html. Qui l'esempio di Spring è per me fonte di confusione. Non ho capito perché è l'impostazione del corpo come query SQL e di nuovo l'importazione di alcune query dal percorso classe. Non vi è alcun esempio di query di inserimento menzionato qui.

+2

componente jdbc utilizza il corpo come origine della query SQL. Se si desidera passare i dati nel proprio corpo, considerare l'utilizzo di SQL (http://camel.apache.org/sql-component.html) o MyBatis (http: //camel.apache.org/mybatis.html) componente –

risposta

5

Probabilmente è necessario eseguire alcune ristrutturazioni del payload prima di inserirlo comunque, quindi non ci dovrebbero essere problemi per eseguire una trasformazione utilizzando qualsiasi metodo in Camel per impostare il corpo alla corretta istruzione INSERT.

L'importante è quale tipo di struttura del carico utile abbia il messaggio in arrivo. Nel caso di base - è una stringa - dovrebbe essere abbastanza semplice

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

Nel caso in cui il messaggio contiene strutture dati complesse, questo codice sarà ovviamente più complessa, ma è più o meno allo stesso modo regolare applicazione genererà Query SQL.

L'esempio classpath si sta riferendo a

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

mostra semplicemente come testare la componente JDBC avviando un server di database incorporato (Apache Derby) e popolarlo con alcuni dati iniziali (SQL/init.sql file). Questa parte non fa realmente parte del componente jdbc di base, ma semplicemente nella documentazione per ottenere ed eseguire un esempio senza la necessità di configurare un server DB e impostare le proprietà di connessione JDBC.

Detto questo, è possibile utilizzare il componente SQL per scenari più complessi.

+3

Si prega di fare attenzione. L'esempio rende molto facile fare un attacco di SQL injection. Tuttavia, potrebbe essere possibile sfuggire al contenuto del corpo per impedirlo. –

+0

Buon punto. Non credo ci sia alcun modo infallibile per fare istruzioni INSERT sicure per l'iniezione SQL con il componente JDBC. I dati devono essere disinfettati manualmente in qualche modo. Quindi, un'altra ragione per usare il componente SQL. OWASP e alcuni altri hanno scritto codice per pulire in qualche modo le istruzioni SQL: https://www.owasp.org/index.php/ESAPI –

+0

Un'altra scelta sicura è usare il componente camel-jpa. Supporta l'aggiunta di righe a un tavolo fuori dalla scatola. Un'altra cosa bella di camel-jpa è che supporta anche l'altra parte in cui si legge da un tavolo e si desidera eliminare i record in caso di successo. –

6

Se si desidera inserire utilizzando la stessa istruzione (modifica solo dei parametri) - utilizzare SQL component.

Se si desidera inserire utilizzando istruzione SQL arbitraria nel componente - utilizzare JDBC component.

SQL utilizzo componente:

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 utilizzo componente:

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

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