वर्तमान लाइन का प्रबंधन

हमने पहला प्रोग्राम लिखा और इसने पूरी तरह से काम किया। हमने एक प्रश्न लिखा, इसे निष्पादित किया, और परिणामस्वरूप, executeQuery () विधि ने हमें एक वस्तु वापस कर दीपरिणाम सेटएक जिसमें क्वेरी के सभी परिणाम शामिल हैं। और अब हम यह पता लगाने की कोशिश करेंगे कि इन परिणामों को इससे कैसे प्राप्त किया जाए।

क्वेरी परिणाम में हजारों पंक्तियाँ और विभिन्न प्रकार के सैकड़ों कॉलम हो सकते हैं, इसलिए यह उतना तुच्छ कार्य नहीं है जितना आप सोच सकते हैं। उदाहरण के लिए, चित्रों को डेटाबेस में संग्रहीत किया जा सकता है, फिर आप इसे डाउनलोड करने के लिए बाइट्स या इनपुटस्ट्रीम के सेट के रूप में चित्र प्राप्त कर सकते हैं।

लेकिन हम सबसे सरल से शुरू करेंगे - " वर्तमान परिणाम रेखा " की अवधारणा के साथ । चूँकि परिणाम में आमतौर पर बहुत सी पंक्तियाँ होती हैं, इसलिए objectपरिणाम सेटअंदर वर्तमान लाइन के लिए एक सूचक है। और क्रमिक रूप से अगली () विधि का उपयोग करके उन्हें पढ़ने के लिए लाइनों को स्विच करता है ।

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

हालाँकि, यदि आपको वास्तव में इसकी आवश्यकता है, तो फ़ाइलों को RandomAccessFile वर्ग का उपयोग करके कहीं भी पढ़ा जा सकता है ।

ResultSet वर्ग भी कुछ इसी तरह की अनुमति देता है और आपको कहीं भी परिणाम के साथ वर्तमान पंक्ति को स्थानांतरित करने की अनुमति देता है। ऐसा करने के लिए, इसके निम्नलिखित तरीके हैं:

तरीका विवरण
1 अगला() अगली पंक्ति पर स्विच करें
2 पहले का() पिछली पंक्ति पर स्विच करें
3 पहले है () मौजूदा लाइन पहले?
4 पहले है () क्या हम पहली पंक्ति के सामने हैं?
5 अंतिम है () क्या मौजूदा लाइन आखिरी है?
6 बाद में है () क्या हम समय सीमा के बाद हैं?
7 निरपेक्ष (इंट एन) Nth लाइन को करंट बनाता है
8 रिश्तेदार (इंट एन) वर्तमान पंक्ति N स्थिति को आगे बढ़ाता है। एन <0 हो सकता है
9 गेटरो () पंक्ति संख्या लौटाता है

तरीके काफी सरल हैं, लेकिन दो स्पष्टीकरण किए जाने की आवश्यकता है। परिणाम, जैसा कि थे, दोनों तरफ खाली रेखाओं द्वारा तैयार किए गए हैं। इसलिए, प्रारंभ में वर्तमान रेखा परिणाम की पहली पंक्ति से पहले है। और पहली पंक्ति प्राप्त करने के लिए, आपको कम से कम एक बार अगली () विधि को कॉल करने की आवश्यकता है ।

यदि आपने अंतिम पंक्ति पर अगली () विधि को कॉल किया है , तो आप अंतिम पंक्ति के बाद पंक्ति में चले गए । आप इससे डेटा नहीं पढ़ सकते, लेकिन कोई त्रुटि नहीं होगी। यहाँ isAfterLast() विधि परिणाम के रूप में सही घोषित करेगी।

उदाहरण:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

वर्तमान पंक्ति से डेटा प्राप्त करना

आपने वर्तमान लाइन को महारत से प्रबंधित करना सीख लिया है। अब आइए जानें कि इससे डेटा कैसे प्राप्त किया जाए। इसके लिए वस्तुपरिणाम सेटऐसी विशेष विधियाँ हैं जिनका वर्णन एक टेम्पलेट द्वारा किया जा सकता है:

getType(numberColumns)

हालांकि, अगर कॉलम का नाम है, तो आप कॉलम नाम से भी प्राप्त कर सकते हैं:

getType(nameColumns)

उदाहरण:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

नीचे मैं एक तालिका प्रदान करूंगा जो आपको SQL डेटा प्रकारों और परिणामसेट विधियों को जोड़ने में मदद करेगी:

एसक्यूएल डेटा प्रकार getXXX() तरीके
चार गेटस्ट्रिंग ()
वरचर गेटस्ट्रिंग ()
int यहाँ getInt ()
तैरना डबल प्राप्त करें ()
सीएलओबी गेटक्लोब ()
ब्लॉब गेटब्लॉब ()
तारीख तारीख लें()
समय समय निकालो()
TIMESTAMP गेटटाइमस्टैम्प ()

बिंदु, मुझे लगता है कि आप इसे प्राप्त करते हैं।

परिणामसेट के बारे में अलग-अलग डेटा प्राप्त करना

हमने यह पता लगाया कि वर्तमान लाइन से डेटा कैसे पढ़ा जाए: कॉलम संख्या और उसके नाम दोनों से। वैसे, मैं कॉलम नाम को उसकी संख्या से कैसे ढूंढ सकता हूं? या परिणाम में स्तंभों की संख्या?

एक ओर, यदि आप अनुरोध लिखते हैं, तो ऐसा लगता है कि आपको यह सब पता है। दूसरी ओर, हम एक प्रोग्राम लिख सकते हैं जो स्क्रीन पर एक क्वेरी का परिणाम प्रदर्शित करता है: क्वेरी हमें पास कर दी जाती है और हम केवल स्क्रीन पर (कंसोल, वेब पेज में) वह सब कुछ प्रदर्शित करना चाहते हैं जो SQL सर्वर लौटाता है हम लोगो को।

JDBC के पास इसके लिए एक विशेष वस्तु है, ResultSetMetaData इंटरफ़ेस । इस प्रकार की वस्तु प्राप्त करना काफी सरल है:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

ResultSetMetaData इंटरफ़ेस में कुछ बहुत ही रोचक तरीके हैं। नीचे सबसे लोकप्रिय हैं:

1 getColumnCount () परिणाम स्तंभों की संख्या लौटाता है
2 getColumnName (इंट कॉलम) स्तंभ नाम लौटाता है
3 getColumnLabel (इंट कॉलम) कॉलम का विवरण लौटाता है
4 गेट कॉलम टाइप () रिटर्न कॉलम प्रकार: संख्या (विशेष कोड)
5 getColumnTypeName () रिटर्न कॉलम प्रकार: स्ट्रिंग
6 getColumnClassName () स्तंभ प्रकार के लिए जावा वर्ग का नाम लौटाता है
7 getTableName () तालिका का नाम लौटाता है
8 getCatalogName () स्तंभ का निर्देशिका नाम लौटाता है
9 getSchemaName () डेटाबेस का स्कीमा नाम लौटाता है
10 isAutoIncrement(इंट कॉलम) क्या कॉलम ऑटो इंक्रीमेंट को सपोर्ट करता है?
ग्यारह अशक्त है () क्या कॉलम में न्यूल हो सकता है?

आइए इसका उपयोग अपनी तालिका के बारे में कुछ सीखने के लिए करें:

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

महत्वपूर्ण! कृपया ध्यान दें कि कॉलम 1 से क्रमांकित हैं। वैसे, पंक्तियाँ भी। यह कितना असामान्य है, है ना?

और यह वह परिणाम है जो मुझे कार्यक्रम चलाने के बाद मिला:

"सी: \ प्रोग्राम फ़ाइलें \ जावा \ jdk-17.0.3.1 \ बिन \ java.exe ...
पहचान java.lang.Integer int यहाँ 4
नाम java.lang.string वरचर 12
स्तर java.lang.Integer int यहाँ 4
सृजित दिनांक java.sql.date तारीख 91
प्रक्रिया निकास कोड 0 के साथ समाप्त हुई