मुझे लगता है कि सूची के रूप में उपयोग करने का मानक तरीका 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 जेडीबीसी ढांचे के साथ काम करने पर एक बहुत अच्छा अनुभाग है। सबसे अधिक, मैं कहूंगा कि प्रत्येक विधि के साथ कुछ कोड लिखने का प्रयास करें और देखें कि आपके लिए सबसे अच्छा क्या काम करता है।
एएफआईके जावा 5 अनुपालन क्वेरी विधि जेडीबीसीटीप्लेट में भी वसंत 3 – Adrian
में उपलब्ध है, अब मैंने जांच की है कि जेडीबीसी टेम्पलेट वसंत 2.5.6 में जेनरिक का उपयोग नहीं कर रहा है, लेकिन यह 3.0.0 में है। मैं भविष्य में एक बहिष्कार गंध करता हूं ... :) – Esko
SimpleJdbcTemplate अब वास्तव में – Helenesh