2009-11-02 3 views
12

मेरा जावा (जेडीके 6) प्रोजेक्ट Spring और JDBCTemplate का उपयोग अपने सभी डेटाबेस एक्सेस के लिए करता है। हमने हाल ही में स्प्रिंग 2.5 से स्प्रिंग 3 (आरसी 1) में अपग्रेड किया है। प्रोजेक्ट एक ओआरएम का उपयोग नहीं करता है जैसे Hibernate और न ही EJBजावा प्रोग्रामिंग - स्प्रिंग और जेडीबीसीटीप्लेट - क्वेरी, क्वेरीफॉरलिस्ट या क्वेरीफॉररोसेट का उपयोग करें?

मैं रिकॉर्ड की एक गुच्छा पढ़ा है, और उनके साथ कुछ आंतरिक प्रक्रिया करने की ज़रूरत है, तो ऐसा लगता है वहाँ कई (अतिभारित) तरीके हैं जैसे: क्वेरी, queryForList और queryForRowSet

क्या मानदंड से एक का उपयोग करने के लिए किया जाना चाहिए दूसरे की बजाय? क्या कोई प्रदर्शन अंतर है? सर्वोत्तम प्रथाएं?

क्या आप इस विषय पर आगे के शोध के लिए कुछ बाहरी संदर्भों की सिफारिश कर सकते हैं?

उत्तर

34

मुझे लगता है कि सूची के रूप में उपयोग करने का मानक तरीका query() विधियों के माध्यम से अन्य किसी भी दृष्टिकोण के बजाय है। query और अन्य विधियों के बीच मुख्य अंतर यह है कि आपको अपने परिणाम सेट को संभालने के लिए कॉलबैक इंटरफेस (या तो RowMapper, RowCallbackHandler, या ResultSetExtractor) को लागू करना होगा।

RowMapper संभावना है कि आप अधिकतर समय का उपयोग करके स्वयं को ढूंढ लेंगे। इसका उपयोग तब किया जाता है जब परिणाम सेट की प्रत्येक पंक्ति आपकी सूची में एक ऑब्जेक्ट से मेल खाती है। आपको केवल एक ही विधि mapRow लागू करना होगा जहां आप अपनी पंक्ति में जाने वाली ऑब्जेक्ट के प्रकार को पॉप्युलेट करते हैं और इसे वापस कर देते हैं। वसंत में BeanPropertyRowMapper भी है जो कॉलम नामों में बीन संपत्ति नामों से मिलान करके सूची में ऑब्जेक्ट्स को पॉप्युलेट कर सकता है (एनबी यह कक्षा सुविधा के लिए सुविधा नहीं है)।

RowCallbackHandler अधिक उपयोगी है जब आपको अपने परिणामों को केवल एक साधारण सूची से अधिक होने की आवश्यकता होती है। आपको इस दृष्टिकोण का उपयोग कर रिटर्न ऑब्जेक्ट का प्रबंधन करना होगा। मुझे आमतौर पर इसका उपयोग करने में मिलता है जब मुझे अपने रिटर्न प्रकार के रूप में मानचित्र संरचना की आवश्यकता होती है (यानी पेड़ तालिका के लिए समूहीकृत डेटा के लिए या यदि मैं प्राथमिक कुंजी के आधार पर कस्टम कैश बना रहा हूं)।

ResultSetExtractor का उपयोग तब किया जाता है जब आप परिणामों के पुनरावृत्ति को नियंत्रित करना चाहते हैं। आप एक विधि को extractData लागू करते हैं जो query पर कॉल का वापसी मूल्य होगा। मुझे केवल इसका उपयोग करने का पता चलता है यदि मुझे कुछ कस्टम डेटा संरचना बनाना है जो कि अन्य कॉलबैक इंटरफेस का उपयोग करके निर्माण करने के लिए अधिक जटिल है।

queryForList() विधियां मूल्यवान हैं कि आपको इन कॉलबैक विधियों को लागू करने की आवश्यकता नहीं है। क्वेरीफोरलिस्ट का उपयोग करने के दो तरीके हैं। पहला यह है कि यदि आप केवल डेटाबेस से एक कॉलम से पूछ रहे हैं (उदाहरण के लिए स्ट्रिंग्स की एक सूची) तो आप उस विधि के संस्करणों का उपयोग कर सकते हैं जो क्लास को तर्क के रूप में लेता है ताकि आपको स्वचालित रूप से उन वर्गों की केवल ऑब्जेक्ट्स की सूची मिल सके ।

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

मैंने वास्तव में जंगली में उपयोग की जाने वाली queryForRowSet विधियों को कभी नहीं देखा है। यह क्वेरी के पूरे परिणाम को CachedRowSet स्प्रिंग SqlRowSet द्वारा छोड़ा गया ऑब्जेक्ट लोड करेगा। मैं इस ऑब्जेक्ट का उपयोग करने में एक बड़ा नकारात्मक पक्ष देखता हूं कि यदि आप अपने आवेदन की अन्य परतों के लिए SqlRowSet पास कर रहे हैं, तो आप उन परतों को अपने डेटा एक्सेस कार्यान्वयन में जोड़ रहे हैं।

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

यदि आप और जानना चाहते हैं तो मैं Spring JDBC documentation और JavaDoc for the classes I've mentioned से परामर्श लेगा। आप स्प्रिंग फ्रेमवर्क पर कुछ किताबों को भी देख सकते हैं। हालांकि यह थोड़ा दिनांकित है Java Development with the Spring Framework जेडीबीसी ढांचे के साथ काम करने पर एक बहुत अच्छा अनुभाग है। सबसे अधिक, मैं कहूंगा कि प्रत्येक विधि के साथ कुछ कोड लिखने का प्रयास करें और देखें कि आपके लिए सबसे अच्छा क्या काम करता है।

3

जब से तुम अद्भुत जेनेरिक्स देश में कर रहे हैं, क्या तुम सच में ऐसा करने के लिए चाहते हो सकता है SimpleJdbcTemplate का उपयोग करें और वस्तुओं की Lists और queryForObject() अलग-अलग वस्तुओं के लिए के लिए अपने query() तरीकों का उपयोग करने के लिए है। इसके लिए तर्क यह है कि JdbcTemplate में उन लोगों की तुलना में उपयोग करना आसान है।

+1

एएफआईके जावा 5 अनुपालन क्वेरी विधि जेडीबीसीटीप्लेट में भी वसंत 3 – Adrian

+1

में उपलब्ध है, अब मैंने जांच की है कि जेडीबीसी टेम्पलेट वसंत 2.5.6 में जेनरिक का उपयोग नहीं कर रहा है, लेकिन यह 3.0.0 में है। मैं भविष्य में एक बहिष्कार गंध करता हूं ... :) – Esko

+0

SimpleJdbcTemplate अब वास्तव में – Helenesh

2

ऊपर दिए गए उत्कृष्ट उत्तरों के लिए एक छोटा सा अतिरिक्त: अतिरिक्त तरीकों, जैसे क्वेरीफोरिंट, क्वेरीफोर लोंग, क्वेरीफोरैप, क्वेरीफोरऑब्जेक्ट, आदि कई बार अच्छे विकल्प लगते हैं यदि आप एक साधारण क्वेरी चला रहे हैं और एक पंक्ति की उम्मीद करते हैं।

हालांकि, अगर आपको 0 या 1 पंक्तियां वापस मिल सकती हैं, तो क्वेरीफोरलिस्ट विधि आम तौर पर आसान होती है, अन्यथा आपको गलत ResultSizeDataAccessException को पकड़ना होगा। मैंने वह कठिन रास्ता सीख लिया।

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

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