2008-11-18 16 views
13

हमारे आवेदन हम कुछ ढांचे की जरूरत है JDBC के आसपास लपेटो करने में डेटा का उपयोग कोड लागू करने के लिए (ORM हमारी पसंद, scalability की वजह से नहीं है)।सरल JDBC आवरण

सबसे अच्छे ढांचे मैं के साथ काम करने के लिए इस्तेमाल Spring-Jdbc है। हालांकि, मेरी कंपनी की नीति बाहरी निर्भरताओं, विशेष रूप से वसंत, जे 2 ईई, आदि से बचने के लिए है तो हम अपने काम से बने जेडीबीसी ढांचे को लिखने के बारे में सोच रहे हैं, कार्यक्षमता समान स्प्रिंग-जेडीबीसी: पंक्ति मैपिंग, त्रुटि प्रबंधन, सहायक सुविधाओं की विशेषताएं जावा 5, लेकिन लेनदेन के समर्थन के बिना।

क्या किसी को ऐसे जेडीबीसी रैपर ढांचे को लिखने का अनुभव है? अगर किसी को अन्य जेडीबीसी रैपर फ्रेमवर्क का उपयोग करने का अनुभव है, तो कृपया अपना अनुभव साझा करें।

अग्रिम धन्यवाद।

+10

"मेरी कंपनी की नीति बाह्य निर्भरताओं, विशेष रूप से वसंत, जे 2 ईई, आदि से बचने के लिए है" वाह यह एक दुःस्वप्न की तरह लगता है। व्हील –

+7

पुन: आविष्कार करने के अंतहीन पाश की तरह लगता है जे 2 ईई एक "बाहरी निर्भरता" है ?? – yegor256

+0

यदि आप मानचित्रण ऑब्जेक्ट करने के लिए सरल SQL निष्पादन की तलाश में हैं, तो Mybatis एक विकल्प है। मैं इसे इस अर्थ में एक ओआरएम नहीं कहूंगा कि यह हाइबरनेट की तरह ऑब्जेक्ट ग्राफ नहीं करता है। यह आपको एसक्यूएल निष्पादित करने की अनुमति देता है, और आपके इनपुट से पैरामीटर में खींचता है, या आउटपुट ऑब्जेक्ट में कॉलम मैप करता है। – Matt

उत्तर

13

हमने अपना खुद का रैपर लिखा था। इस विषय को एक कागज के योग्य है, लेकिन मुझे शक है मैं कभी भी यह लिखने के लिए समय होगा, इसलिए यहाँ हैं कुछ प्रमुख बिंदु:

  • हम एसक्यूएल गले लगा लिया और इसे छिपाने के लिए कोई प्रयास नहीं किया। नामित पैरामीटर के लिए समर्थन जोड़ने का एकमात्र ट्विक था। पैरामीटर महत्वपूर्ण हैं क्योंकि हम ऑन-द-फ्लाई एसक्यूएल (सुरक्षा कारणों से) के उपयोग को प्रोत्साहित नहीं करते हैं और हम हमेशा तैयार किए गए स्टेटमेंट का उपयोग करते हैं।

  • संबंध प्रबंधन के लिए, हम अपाचे DBCP इस्तेमाल किया। यह उस समय सुविधाजनक था लेकिन यह स्पष्ट नहीं है कि आधुनिक जेडीबीसी कार्यान्वयन के साथ इसकी कितनी आवश्यकता है (इस सामान पर दस्तावेज़ों की कमी है)। डीबीसीपी भी तैयार स्टेशनों को पूल करता है।

  • हम पंक्ति मानचित्रण के साथ परेशान नहीं किया। इसके बजाए (प्रश्नों के लिए) हमने अपाचे डबुटिल के परिणाम सैलहैंडलर के समान कुछ उपयोग किया, जो आपको परिणाम सेट को "फ़ीड" करने की अनुमति देता है, जिससे आप जहां भी चाहें जानकारी को डंप कर सकते हैं। यह अधिक लचीला है, और वास्तव में पंक्ति मैपिंग के लिए परिणामसेट हैंडलर को कार्यान्वित करना मुश्किल नहीं होगा। आवेषण/अपडेट के लिए हमने एक सामान्य रिकॉर्ड क्लास बनाया (मूल रूप से कुछ अतिरिक्त घंटियाँ और सीटी के साथ एक हैशप)। पंक्ति मैपिंग (हमारे लिए) के साथ सबसे बड़ी समस्या यह है कि जैसे ही आप एक "रोचक" क्वेरी करते हैं, आप फंस जाते हैं क्योंकि आपके पास फ़ील्ड जो विभिन्न वर्गों के लिए मानचित्र हो सकते हैं; क्योंकि आपके पास पदानुक्रमित वर्ग संरचना हो सकती है लेकिन एक फ्लैट परिणाम सेट हो सकता है; या क्योंकि मानचित्रण जटिल और डेटा निर्भर है।

  • हमने त्रुटि लॉगिंग में बनाया है। अपवाद हैंडलिंग के लिए: एक प्रश्न पर हम जाल और लॉग करते हैं, लेकिन एक अद्यतन के लिए हम एक अनचेक अपवादों को जाल, लॉग और पुनर्स्थापित करते हैं।

  • हम एक आवरण दृष्टिकोण का उपयोग कर लेन-देन सहायता प्रदान की। कॉलर लेनदेन करने वाला कोड प्रदान करता है, और हम यह सुनिश्चित करते हैं कि लेनदेन को सही तरीके से प्रबंधित करने और रोलबैक और अंतर्निहित त्रुटि प्रबंधन के साथ भूलने का कोई मौका नहीं है।

  • बाद में, हम एक बहुत ही साधारण संबंध योजना है कि एक ही अद्यतन/डालने एक रिकॉर्ड और उसके सभी निर्भरता को लागू करने के लिए अनुमति देता है जोड़ा। चीजों को सरल रखने के लिए, हमने इसका इस्तेमाल प्रश्नों पर नहीं किया, और हमने विशेष रूप से यह तय करने का फैसला किया कि इसे हटाए गए लोगों के साथ समर्थन न करें क्योंकि यह कैस्केड डिलीट का उपयोग करने के लिए अधिक विश्वसनीय है।

यह रैपर आज तक दो परियोजनाओं में सफलतापूर्वक उपयोग किया गया है। यह निश्चित रूप से हल्का वजन है, लेकिन इन दिनों हर कोई कहता है कि उनका कोड हल्का है। इससे भी महत्वपूर्ण बात यह है कि यह प्रोग्रामर उत्पादकता को बढ़ाता है, बगों की संख्या को कम करता है (और समस्याओं को ट्रैक करने में आसान बनाता है), और आवश्यकता होने पर यह पता लगाने में अपेक्षाकृत आसान है क्योंकि हम सुंदर वास्तुकला प्रदान करने के लिए बहुत सारी परतें जोड़ने में विश्वास नहीं करते हैं।

5

वसंत-जेडीबीसी शानदार है। इस बात पर विचार करें कि वसंत जैसे ओपन सोर्स प्रोजेक्ट के लिए बाहरी निर्भरता के नीचे की ओर कम किया गया है। आप स्प्रिंग के सबसे स्थिर संस्करण को अपना सकते हैं जो आपकी जेडीबीसी अबास्ट्रक्शन आवश्यकताओं को पूरा करता है और आप जानते हैं कि अगर आप कभी भी किसी समस्या में भाग लेते हैं तो आप हमेशा स्रोत कोड को संशोधित करने में सक्षम होंगे - बाहरी पार्टी के आधार पर। आप किसी भी सुरक्षा चिंताओं के लिए कार्यान्वयन की जांच भी कर सकते हैं कि आपके संगठन के पास बाहरी पार्टी द्वारा लिखे गए कोड के साथ हो सकता है।

1

jcabi-jdbc से JdbcSession आज़माएं।

String name = new JdbcSession(source) 
    .sql("SELECT name FROM foo WHERE id = ?") 
    .set(123) 
    .select(new SingleOutcome<String>(String.class)); 

यह है कि: यह उदाहरण के लिए, के रूप में सरल रूप में JDBC होना चाहिए।

1

यह एक बहुत ही कम दृष्टि वाले निर्णय की तरह लगता है। इस तरह के ढांचे को विकसित/बनाए रखने की लागत पर विचार करें, खासकर जब आप इसे प्राप्त कर सकें, और यह मुफ्त में स्रोत कोड है। न केवल आपको खुद को विकास करने की ज़रूरत है, यदि आवश्यकता हो तो आप इसे इच्छानुसार संशोधित कर सकते हैं।

कहा जा रहा है कि, आपको वास्तव में डुप्लिकेट करने की आवश्यकता है, जेडीबीसी टेम्पलेट और इसकी कॉलबैक (प्रीपेडस्टेटमेंट क्रिएटर, प्रीपेर्डस्टेटमेंट कॉलबैक), और साथ ही रोमैपर/रोकॉलबैक हैंडलर की धारणा है। ऐसा कुछ लिखने के लिए इसे अधिक जटिल नहीं किया जाना चाहिए (विशेष रूप से आपको लेनदेन प्रबंधन करने की आवश्यकता नहीं है)।

हाउवर, जैसा कि मैंने कहा है, जब आप इसे मुफ्त में प्राप्त कर सकते हैं और स्रोत कोड को संशोधित करते हैं तो आप इसे क्यों लिखते हैं?

2

मुझे पसंद है: Dalesbred। यह एमआईटी लाइसेंस प्राप्त है।

कस्टम वर्ग (विभाग) के लिए सभी पंक्तियां प्राप्त करने का एक सरल उदाहरण।

List<Department> departments = db.findAll(Department.class, 
    "select id, name from department"); 

जब कस्टम वर्ग के रूप में परिभाषित किया गया है:

public final class Department { 
    private final int id; 
    private final String name; 

    public Department(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

अस्वीकरण: यह एक कंपनी मैं के लिए काम से है।

संबंधित मुद्दे