2012-05-27 59 views
5

Quiero insertar exchange.body en una tabla de base de datos para una de las condiciones de mi ruta.Ejemplo de Apache Camel para insertar una fila en una tabla

  • ¿Hay algún ejemplo/tutorial del componente camel-jdbc para insertar el cuerpo del mensaje?
  • ¿Puedo importar la declaración SQL y pasarle exchange.body?

Miré http://camel.apache.org/jdbc.html ejemplo, pero no pude entenderlo.

Aquí el ejemplo de Spring es confuso para mí. No entendí por qué está configurando el cuerpo como consulta SQL e importando de nuevo una consulta desde la ruta de la clase. (No hay ningún ejemplo de consulta de inserción mencionado aquí.)

+0

@AndrewThompson me buscó algunos ejemplos, pero no soy capaz de entenderlos. No pude encontrar ningún específico para insertar el cuerpo del mensaje. –

+0

@AndrewThompson No pude entender el ejemplo de http://camel.apache.org/jdbc.html. Aquí el ejemplo de Spring es confuso para mí. No entendí por qué está configurando el cuerpo como consulta SQL e importando de nuevo alguna consulta desde la ruta de la clase. No hay un ejemplo de consulta de inserción mencionado aquí.

+2

El componente jdbc usa el cuerpo como fuente de consulta SQL. Si desea pasar datos en su cuerpo, considere usar SQL (http://camel.apache.org/sql-component.html) o MyBatis (http: //camel.apache.org/mybatis.html) componente –

Respuesta

5

Es probable que necesite reestructurar su carga útil antes de insertarla de todos modos, por lo que probablemente no haya problema para realizar una transformación utilizando el método de Camel para configurar el cuerpo. a la declaración INSERT apropiada.

Lo importante es qué clase de estructura de carga tiene su mensaje entrante. En el caso básica - es una cadena - que debe ser bastante simple

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

En caso de que su mensaje contiene estructuras de datos complejas, este código será, por supuesto, ser más compleja, pero es más o menos la misma manera que la aplicación regular generará Consultas SQL.

La ruta de clase ejemplo usted se refiere a

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

simplemente muestra cómo probar el componente JDBC iniciando un servidor de base de datos integrada (Apache Derby) y rellenarla con algunos datos iniciales (SQL/init.sql archivo). Esta parte no es realmente parte del componente core jdbc, sino simplemente en la documentación para iniciar y ejecutar una muestra sin necesidad de configurar un servidor DB y configurar las propiedades de la conexión JDBC.

Dicho esto, es posible que desee utilizar el componente SQL para escenarios más complejos.

+3

Tenga cuidado. El ejemplo hace que sea muy fácil hacer un ataque de inyección SQL. Sin embargo, es posible escapar del contenido del cuerpo para evitar esto. –

+0

Buen punto. No creo que exista ninguna forma infalible de hacer sentencias INSERT seguras con inyección SQL con el componente JDBC. Los datos deben ser desinfectados manualmente de alguna manera. Entonces, otra razón para usar el componente SQL en su lugar. OWASP y algunos otros han escrito código para limpiar sentencias SQL hasta cierto punto: https://www.owasp.org/index.php/ESAPI –

+0

Otra opción segura es usar el componente camel-jpa. Es compatible con la adición de filas a una tabla de la caja. Otra cosa agradable sobre camel-jpa es que también admite el otro lado donde se lee de una tabla y se quieren eliminar los registros de éxito. –

6

Si desea insertar usando la misma instrucción (cambiando solo los parámetros) - use SQL component.

Si desea insertar usando declaración SQL arbitraria en el componente - use JDBC component. el uso de componentes

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 uso de componentes:

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

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