2010-01-12 13 views
24

के साथ कस्टम डेटा से प्रोग्रामेटिक रूप से जावा परिणामसेट बनाने के लिए कैसे करें मेरे पास कुछ मौजूदा कोड है जो java.sql.ResultSet स्वीकार करता है जिसमें ओरेकल डेटाबेस से पुनर्प्राप्त जानकारी शामिल होती है। अब मैं इस कोड का पुन: उपयोग करना चाहूंगा, लेकिन मैं इसे ResultSet ऑब्जेक्ट पास करना चाहता हूं कि मैं अपने आप को कुछ इन-मेमोरी डेटा से बनाउंगा जो किसी भी डेटाबेस से संबद्ध नहीं है। क्या कोई मौजूदा जावा फ्रेमवर्क क्लास है जिसके लिए मैं इसका उपयोग कर सकता हूं? ResultSet में कई विधियां हैं, इसलिए इसके लिए अपनी कक्षा को कार्यान्वित करना बहुत अधिक लग रहा था, भले ही मैं अपने विशिष्ट मामले के अधिकांश तरीकों को अनदेखा कर सकता हूं।बिना किसी डेटाबेस

मैं पुराने माइक्रोसॉफ्ट एडीओ रिकॉर्डसेट ऑब्जेक्ट के साथ कुछ सोच रहा था, जहां मैं खेतों को बना सकता था और फिर प्रत्येक फ़ील्ड के लिए पंक्ति डेटा तैयार कर सकता था। यह आसानी से googlable सवाल की तरह लग रहा था, लेकिन मैं कोई अच्छा संकेतक खोजने में असमर्थ रहा है।

+1

'java.sql.ResultData' क्या है? – skaffman

+0

हे। धन्यवाद .. प्रूफरीडिंग के बाद भी, मैंने मूर्खतापूर्वक इसे 'परिणामसेट' के बजाय 'परिणामडेटा' कहा ... अब संपादन करने के लिए वापस! –

+0

यह रूप में अच्छी तरह मदद कर सकता है: http://stackoverflow.com/questions/878848/easy-way-to-fill-up-resultset-with-data –

उत्तर

15
  • काम करना चाहिए अपने स्वयं के AbstractResultSet कक्षा बनाएं , एक (जैसे सारक्यूयूयू) असमर्थितऑपरेशन अपवाद को फेंक कर सभी विधियों को लागू करता है (ग्रहण इन तरीकों को एक दूसरे भाग में स्वत: उत्पन्न करता है)।
  • अब AbstractResultSet का विस्तार करें। उप-वर्ग केवल उन तरीकों को ओवरराइड कर सकता है जिन्हें आप कार्यान्वित करने में रुचि रखते हैं।
+0

धन्यवाद। मैं इस मार्ग पर जा रहा था। AbstractResultSet क्लास सभी 'फेंक' कथन के शोर के लिए उपयोग करने के लिए एक अच्छी परत है, और अंतिम कार्यान्वयन कक्षा में केवल सार्थक कोड हो सकता है। –

+0

मैंने उस https://gist.github.com/vilaca/3800337ccabea28a75d9165aaddefc9f के साथ एक गिस्ट बनाया –

0

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

+0

ओह ... मेरा मतलब 'ResultSet ', और यह नहीं बल्कि एक अंतरफलक है एक ठोस वर्ग की तुलना में, इसलिए मैंने सोचा कि ठीक रहेगा। परिणामसेट अपनी सामग्री में बहुत परिवर्तनीय हो सकता है, इसलिए सूची बनाना सबसे अच्छा विकल्प नहीं था। –

1

मेरा पहला विकल्प, इतना है कि यह सूची < मानचित्र < स्ट्रिंग लेता कोड refactor करने के लिए किया जाएगा वस्तु > > या कुछ और उचित (जो है, सूची < मानचित्र < स्ट्रिंग, वस्तु > > अगर डेटा चारों ओर ले जाया जा रहा नहीं है असली संरचना या पूरी तरह से टाइप की गई वस्तुओं अगर संरचना है)।

यदि यह व्यवहार्य या समय प्रभावी नहीं है, तो "मजेदार" हैक एक परिणामसेट प्राप्त करने के लिए इन-मेमोरी H2 डेटाबेस से पूछताछ करना है। यदि आपको परिणामसेट के लिए उचित स्टब नहीं मिलता है तो आप आसानी से तत्काल हो सकते हैं, यह आपके खुद को रोल करने से तेज हो सकता है (जार खींचें, डीबी बनाने और तालिका को पॉप्युलेट करने के लिए कोड की 20 लाइनें लिखें)।

+0

सहमत हैं, यही वह है जो मैं जावा शब्दों में प्राप्त करने की कोशिश कर रहा था। +1 –

2

java.sql.ResultSet एक इंटरफ़ेस है, इसलिए आप अपनी खुद की कक्षा बना सकते हैं जो उस इंटरफ़ेस को लागू करता है।

+1

उन्होंने स्पष्ट रूप से कहा कि परिणामसेट लागू करना काम का एक टन है (यह वास्तव में है)। – alex

+1

+1, हालांकि इसमें # और *! विधियों का भार है। –

+0

अगर अपने डेटाबेस विशिष्ट ResultSet कक्षाओं की कार्यक्षमता के सभी प्राप्त करने के लिए कोशिश कर रहे हैं यह हो सकता है, लेकिन यदि आप केवल कुछ विशिष्ट मामलों के लिए एक ResultSet की नकल करने की कोशिश कर रहे हैं तो यह बिल्कुल मुश्किल नहीं होना चाहिए। ऐसा लगता है जैसे उसने कहा। वह अधिकांश तरीकों को अनदेखा कर सकता है। – rayd09

7

यह थोड़ा सा बाएं क्षेत्र का समाधान है, लेकिन आप एक मॉकिंग फ्रेमवर्क (उदा। JMock) का उपयोग कर सकते हैं। ये ढांचे आम तौर पर यूनिट परीक्षण के लिए इंटरफेस के नकली कार्यान्वयन के लिए लक्षित होते हैं, लेकिन मुझे कोई कारण नहीं दिखता कि आप java.sql.ResultSet का "आंशिक कार्यान्वयन" बनाने के लिए क्यों उपयोग कर सकते हैं।

उदाहरण के लिए, मान लीजिए कि आप केवल getString() विधि, और कुछ नहीं लागू करने के लिए चाहता था:

Mockery mockery = new Mockery(); 
final ResultSet resultSet = mockery.mock(ResultSet.class); 

mockery.checking(new Expectations() {{ 
    allowing(resultSet).getString(1); will(returnValue("my first string")); 
    allowing(resultSet).getString(2); will(returnValue("my second string")); 
}}); 

// resultSet is now a java.sql.ResultSet object, which you can pass to your legacy code 
resultSet.getString(1); 

बल्कि अपरंपरागत, और काफी बोझिल है, लेकिन यह

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