वर्तमान ओळ व्यवस्थापित करणे

आम्ही पहिला प्रोग्राम लिहिला आणि तो उत्तम प्रकारे काम करतो. आम्ही एक क्वेरी लिहिली, ती कार्यान्वित केली आणि परिणामी, executeQuery() पद्धतीने आम्हाला एक ऑब्जेक्ट परत केलापरिणाम सेटज्यामध्ये क्वेरीचे सर्व परिणाम असतात. आणि आता आम्ही त्यातून हे परिणाम कसे मिळवायचे ते शोधण्याचा प्रयत्न करू.

क्वेरी परिणामामध्ये हजारो पंक्ती आणि विविध प्रकारचे शेकडो स्तंभ असू शकतात, म्हणून हे तुम्हाला वाटते तितके क्षुल्लक काम नाही. उदाहरणार्थ, डेटाबेसमध्ये चित्रे संग्रहित केली जाऊ शकतात, नंतर तुम्हाला बाइट्सचा संच म्हणून किंवा ते डाउनलोड करण्यासाठी इनपुटस्ट्रीम म्हणून चित्र मिळू शकते.

परंतु आम्ही सर्वात सोप्यापासून सुरुवात करू - " वर्तमान परिणाम रेखा " या संकल्पनेसह . परिणामामध्ये सहसा बर्याच पंक्ती असतात, ऑब्जेक्टपरिणाम सेटआत चालू रेषेकडे एक पॉइंटर आहे. आणि पुढील () पद्धत वापरून वाचण्यासाठी ओळी क्रमशः स्विच करते .

हा दृष्टिकोन प्रामुख्याने ऑप्टिमायझेशनसाठी केला जातो. JDBC ड्रायव्हर डेटाबेसमधून स्ट्रिंग्स लोड करू शकत नाही जोपर्यंत तुम्हाला ते क्रमशः वाचायला मिळत नाही. तुम्ही देखील FileInputStream सुरुवातीपासून शेवटपर्यंत क्रमाने वाचा. त्यामुळे हा दृष्टिकोन तुम्हाला परिचित आणि समजण्यासारखा असावा.

तथापि, जर तुम्हाला त्याची खरोखर गरज असेल, तर RandomAccessFile वर्ग वापरून फाइल्स कुठेही वाचता येतील .

ResultSet क्लास देखील तत्सम काहीतरी अनुमती देतो आणि तुम्हाला सध्याची पंक्ती निकालासोबत कुठेही हलवण्याची परवानगी देतो. हे करण्यासाठी, त्याच्याकडे खालील पद्धती आहेत:

पद्धत वर्णन
पुढे() पुढील ओळीवर स्विच करा
2 मागील() मागील ओळीवर स्विच करा
3 is First() वर्तमान ओळ प्रथम?
4 isBeforeFirst() आपण पहिल्या ओळीच्या समोर आहोत का?
isLast() सध्याची ओळ शेवटची आहे का?
6 isAfterLast() आम्ही अंतिम मुदतीनंतर आहोत का?
निरपेक्ष(int n) Nवी रेषा चालू करते
8 नातेवाईक(int n) वर्तमान रेषा N पोझिशन्स पुढे हलवते. N <0 असू शकते
getRow() ओळ क्रमांक मिळवते

पद्धती अगदी सोप्या आहेत, परंतु दोन स्पष्टीकरणे करणे आवश्यक आहे. परिणाम दोन्ही बाजूंच्या रिकाम्या रेषांनी बनवलेले आहेत. म्हणून, सुरुवातीला वर्तमान ओळ निकालाच्या पहिल्या ओळीच्या आधी आहे. आणि पहिली पंक्ती मिळविण्यासाठी, तुम्हाला किमान एकदा पुढील() पद्धतीवर कॉल करणे आवश्यक आहे .

जर तुम्ही शेवटच्या ओळीवर पुढील() पद्धत कॉल केली असेल , तर तुम्ही शेवटच्या ओळीवर गेलात . आपण त्यातून डेटा वाचू शकत नाही, परंतु कोणतीही त्रुटी येणार नाही. येथे 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 डेटा प्रकार आणि ResultSet पद्धती संबद्ध करण्यात मदत करेल:

SQL डेटा प्रकार XXX() पद्धती मिळवा
CHAR getString()
वरचार getString()
INT getInt()
फ्लोट getDouble()
CLOB getClob()
BLOB getBlob()
DATE getDate()
TIME getTime()
टाइमस्टॅम्प getTimestamp()

मुद्दा, मला वाटते तुम्हाला ते समजले आहे.

ResultSet बद्दल वेगळा डेटा मिळवणे

आम्ही वर्तमान ओळीतून डेटा कसा वाचायचा ते शोधून काढले: स्तंभ क्रमांक आणि त्याच्या नावाने. तसे, मी स्तंभाचे नाव त्याच्या क्रमांकावरून कसे शोधू शकतो? किंवा निकालातील स्तंभांची संख्या?

एकीकडे जर तुम्ही विनंती लिहिली तर तुम्हाला हे सर्व माहित असावे असे वाटते. दुसरीकडे, आम्ही एक प्रोग्राम लिहू शकतो जो स्क्रीनवर क्वेरीचा निकाल प्रदर्शित करतो: क्वेरी आमच्याकडे पाठविली जाते आणि आम्ही फक्त स्क्रीनवर प्रदर्शित करू इच्छितो (कन्सोल, वेब पृष्ठावर) SQL सर्व्हरने परत केलेल्या सर्व गोष्टी. आम्हाला.

JDBC कडे यासाठी एक विशेष ऑब्जेक्ट आहे, ResultSetMetaData इंटरफेस . या प्रकारची वस्तू मिळवणे अगदी सोपे आहे:

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

ResultSetMetaData इंटरफेसमध्ये काही अतिशय मनोरंजक पद्धती आहेत. खाली सर्वात लोकप्रिय आहेत:

getColumnCount() परिणाम स्तंभांची संख्या मिळवते
2 getColumnName(int column) स्तंभाचे नाव मिळवते
3 getColumnLabel(इंट कॉलम) स्तंभाचे वर्णन मिळवते
4 getColumnType() परतावा स्तंभ प्रकार: क्रमांक (विशेष कोड)
getColumnTypeName() स्तंभ प्रकार मिळवते: स्ट्रिंग
6 getColumnClassName() स्तंभ प्रकारासाठी java वर्ग नाव मिळवते
getTableName() टेबलचे नाव मिळवते
8 getCatalogName() स्तंभाचे निर्देशिका नाव मिळवते
getSchemaName() डेटाबेसचे स्कीमा नाव परत करते
10 isAutoIncrement(int स्तंभ) कॉलम ऑटो इन्क्रिमेंटला सपोर्ट करतो का?
अकरा रद्द करण्यायोग्य आहे() स्तंभात NULL असू शकते का?

आमच्या टेबलबद्दल थोडे जाणून घेण्यासाठी त्याचा वापर करूया:

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 पासून क्रमांकित आहेत. पंक्ती, तसे, देखील. ते किती असामान्य आहे, बरोबर?

आणि प्रोग्राम चालवल्यानंतर मला मिळालेला हा परिणाम आहे:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
आयडी java.lang.Integer INT 4
नाव java.lang.string वरचार १२
पातळी java.lang.Integer INT 4
निर्मित_तारीख java.sql.date DATE ९१
एक्झिट कोड 0 सह प्रक्रिया पूर्ण झाली