2012-05-27 9 views
5

मैं अपने मार्ग की स्थिति में से किसी एक के लिए डेटाबेस तालिका में Exchange.body डालना चाहता हूं।अपाचे कैमल उदाहरण तालिका में एक पंक्ति डालने के लिए उदाहरण

  • संदेश निकालने के लिए ऊंट-जेडीबीसी घटक का कोई उदाहरण/ट्यूटोरियल है?
  • क्या मैं स्वयं SQL स्टेटमेंट आयात कर सकता हूं और एक्सचेंज पास कर सकता हूं?

मैंने http://camel.apache.org/jdbc.html उदाहरण देखा, लेकिन इसे समझ में नहीं आया।

यहां वसंत उदाहरण मेरे लिए भ्रमित है। मुझे नहीं मिला कि यह शरीर को SQL क्वेरी के रूप में क्यों सेट कर रहा है और फिर कक्षा पथ से कुछ क्वेरी आयात कर रहा है। (यहां उल्लिखित कोई सम्मिलित प्रश्न उदाहरण नहीं है।)

+0

@AndrewThompson मैं कुछ उदाहरण के लिए देखा है, लेकिन मैं उन्हें समझ नहीं पा रहा हूँ। मुझे संदेश निकाय डालने के लिए कोई विशिष्ट नहीं मिला। –

+0

@AndrewTompson मैं http://camel.apache.org/jdbc.html उदाहरण को समझ नहीं पाया। यहां वसंत उदाहरण मेरे लिए भ्रमित है। मुझे नहीं मिला कि यह शरीर को एसक्यूएल क्वेरी के रूप में क्यों स्थापित कर रहा है और फिर कक्षा पथ से कुछ क्वेरी आयात कर रहा है। यहां उल्लिखित कोई सम्मिलित क्वेरी उदाहरण नहीं है।

+2

जेडीबीसी घटक एसक्यूएल क्वेरी के स्रोत के रूप में शरीर का उपयोग करता है। यदि आप अपने शरीर में डेटा पास करना चाहते हैं तो SQL (http://camel.apache.org/sql-component.html) या MyBatis (http: //camel.apache) का उपयोग करने पर विचार करें।संगठन/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)"); 

मामले में अपना संदेश जटिल डेटा संरचनाओं में शामिल है, इस कोड को निश्चित रूप से और अधिक जटिल हो जाएगा होना चाहिए, लेकिन यह बहुत ज्यादा एक ही तरीके नियमित रूप से आवेदन उत्पन्न होगा है एसक्यूएल प्रश्न

classpath उदाहरण आप

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

की बात कर रहे, बस पता चलता है कि कैसे एक डेटाबेस सर्वर एम्बेडेड (अपाचे डर्बी) शुरू करने से JDBC घटक का परीक्षण करने और (कुछ प्रारंभिक डेटा से पॉप्युलेट एसक्यूएल/init.sql को फ़ाइल)। यह हिस्सा कोर जेडीबीसी घटक का वास्तव में हिस्सा नहीं है, लेकिन बस एक डीबी सर्वर को कॉन्फ़िगर करने और जेडीबीसी कनेक्शन गुणों को सेट किए बिना नमूना उठाने और चलाने के लिए प्रलेखन में है।

उस ने कहा, आप अधिक जटिल परिदृश्यों के लिए SQL घटक का उपयोग करना चाह सकते हैं।

+3

कृपया सावधान रहें। उदाहरण एसक्यूएल इंजेक्शन हमले करना बहुत आसान बनाता है। हालांकि इसे रोकने के लिए शरीर की सामग्री से बचना संभव हो सकता है। –

+0

अच्छा बिंदु। मुझे नहीं लगता कि जेडीबीसी घटक के साथ एसक्यूएल इंजेक्शन सुरक्षित इंसर्ट स्टेटमेंट करने के लिए कोई मूर्ख सबूत तरीका है। डेटा को मैन्युअल रूप से किसी भी तरह से sanitized किया जाना है। तो, इसके बजाय SQL घटक का उपयोग करने का एक और कारण है। ओडब्ल्यूएएसपी और कुछ अन्य ने कुछ हद तक एसक्यूएल स्टेटमेंट को साफ करने के लिए कोड लिखा है: https://www.owasp.org/index.php/ESAPI –

+0

ऊंट-जेपीए घटक का उपयोग करना एक और सुरक्षित विकल्प है। यह बॉक्स के बाहर एक तालिका में पंक्तियों को जोड़ने का समर्थन करता है। ऊंट-जेपीए के बारे में एक और अच्छी बात यह है कि यह दूसरी तरफ भी समर्थन करता है जहां आप एक टेबल से पढ़ते हैं और सफलता पर रिकॉर्ड हटाना चाहते हैं। –

6

यदि आप का उपयोग उसी कथन (केवल पैरामीटर बदलना) का उपयोग करना चाहते हैं - SQL component का उपयोग करें।

यदि आप घटक में मनमाने ढंग से SQL कथन का उपयोग करना चाहते हैं - JDBC component का उपयोग करें।

एसक्यूएल घटक उपयोग:

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')"); 
संबंधित मुद्दे