JavaRush /Kurslar /All lectures for UZ purposes /ResultSet'dan ma'lumot olish

ResultSet'dan ma'lumot olish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Joriy qatorni boshqarish

Birinchi dasturimizni yozdik va u a'lo darajada ishladi. Biz so'rov yozdik, uni bajardik va natijada executeQuery() metodi bizga ResultSet obyektini qaytardi, u so'rovning barcha natijalarini o'z ichiga oladi. Endi biz bu natijalarni qanday olishni tushunishga harakat qilamiz.

So'rov natijasi minglab qatorlar va turli xil turlardagi yuzlab ustunlarni o'z ichiga olishi mumkin, shuning uchun bu siz o'ylaganingizdek oddiy vazifa emas. Masalan, bazada rasmlar saqlanishi mumkin, shunda siz rasmlarni baytlar to'plami yoki yuklab olish uchun InputStream tarzida olishingiz mumkin.

Lekin biz eng oddiy narsadan boshlaymiz - “natijaning joriy qatori” tushunchasidan. Natijada qatorlar juda ko'p bo'lganligi sababli, ResultSet obyektida joriy qatorni ko'rsatadigan pointer mavjud. Va next() metodi yordamida qatorlarni o'qish uchun ketma-ket almashadi.

Bunday yondashuv, birinchi navbatda, optimallashtirish uchun qilingan. JDBC Driver qatorlarni ma'lumotlar bazasidan yuklamasligi mumkin, siz ketma-ket o'qishga etib bormaguncha. FileInputStreamni ham boshidan oxirigacha ketma-ket o'qiysiz. Shunday yondashuv sizga tanish va tushunarli bo'lishi kerak deb o'ylayman.

Lekin agar sizga juda kerak bo'lsa, fayllarni istalgan joyda RandomAccessFile sinfi yordamida o'qishingiz mumkin.

ResultSet sinfi ham shunga o'xshash imkoniyatlarga ega va joriy qatorni natijada istalgan joyga ko'chirishga imkon beradi. Buning uchun unda quyidagi metodlar mavjud:

Metod Ta'rif
1 next() Keyingi qatorga o'tish
2 previous() Oldingi qatorga o'tish
3 isFirst() Joriy qator birinchimi?
4 isBeforeFirst() Biz birinchi qator oldidamizmi?
5 isLast() Joriy qator oxirgimi?
6 isAfterLast() Biz oxirgi qatordan keyinmizmi?
7 absolute(int n) N-qatorni joriy qator qiling
8 relative(int n) Joriy qatorni N pozitsiya oldinga siljiting. N <0 bo'lishi mumkin
9 getRow() Qator raqamini qaytaradi

Metodlar yetarli darajada oddiy, lekin ikkita tushuntirish kiritish kerak. Natijalar ikki tomondan bo'sh qatorlar bilan o'ralgan. Shuning uchun dastlab joriy qator natijaning birinchi qatoridan oldinda joylashgan. Birinchi qatorni olish uchun next() metodini hech bo'lmaganda bir marta chaqirish kerak.

Agar siz oxirgi qatorda next() metodini chaqirsangiz, siz oxirgi qatoridan keyingi qatoriga o'tasiz. Siz undan ma'lumot o'qiy olmaysiz, lekin hech qanday xato ro'y bermaydi. Bu yerda isAfterLast() metodi true natija sifatida qaytaradi.

Misol:


    	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

Joriy qatoridan ma'lumot olish

Joriy qatorni qanday boshqarishni mahorat bilan o'rganding. Endi undan ma'lumotlarni qanday olishni ko'rib chiqamiz. Bu uchun ResultSet obyekti maxsus metodlarga ega, ularning barchasini bitta shablon bilan tavsiflash mumkin:


getType(ustunRaqami)

Agar ustunning nomi bo'lsa, uni ustun nomi orqali olish mumkin:


getType(ustunNomi)

Misol:


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

Quyida men SQL ma'lumotlar turlari va ResultSet metodlarini bog'lashda yordam beradigan jadvalni taqdim etaman:

SQL Datatype getXXX() Metodlar
CHAR getString()
VARCHAR getString()
INT getInt()
FLOAT getDouble()
CLOB getClob()
BLOB getBlob()
DATE getDate()
TIME getTime()
TIMESTAMP getTimestamp()

Mohiyatini tushungan bo'lsang kerak deb o'ylayman.

ResultSet haqida turli ma'lumotlar olish

Joriy qatoridan ma'lumotlarni qanday o'qishni o'rgandik: ustun raqami bo'yicha va uning nomi bo'yicha. Aytgancha, ustun nomini raqamiga qarab qanday bilsa bo'ladi? Yoki natijadagi ustunlar sonini?

Bir tomondan, agar siz so'rovni yozayotgan bo'lsangiz, bu ma'lumotlarni bilishingiz kerak. Boshqa tomondan, biz so'rov natijasini ekranga ko'rsatadigan dastur yozishimiz mumkin: bizga so'rovni berishadi va biz SQL-serverdan qaytarilgan barcha narsalarni ekranda (konsolda, veb-sahifada) ko'rsatishni xohlaymiz.

Buning uchun JDBC'da maxsus obyekt – interfeys ResultSetMetaData mavjud. Ushbu turdagi ob'ektni olish juda oson:


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

Interfeys ResultSetMetaData juda qiziqarli metodlarga ega. Quyida men eng mashhurlarini taqdim etaman:

1 getColumnCount() Natijadagi ustunlar sonini qaytaradi
2 getColumnName(int column) Ustun nomini qaytaradi
3 getColumnLabel(int column) Ustun tavsifini qaytaradi
4 getColumnType() Ustun turini qaytaradi: raqam (maxsus kod)
5 getColumnTypeName() Ustun turini qaytaradi: satr
6 getColumnClassName() Ustun turi uchun java-sinf nomini qaytaradi
7 getTableName() Jadval nomini qaytaradi
8 getCatalogName() Ustun katalog nomini qaytaradi
9 getSchemaName() Ma'lumotlar bazasi sxemasi nomini qaytaradi
10 isAutoIncrement(int column) Ustun AUTO INCREMENT qo'llab-quvvatlaydi?
11 isNullable() Ustun NULL saqlashi mumkin?

Keling, uning yordamida jadvalimiz haqida bir oz bilib olaylik:


        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);
    	}

MuHim! E'tibor bering, ustunlar 1 dan boshlab belgilanadi. Xuddi shunday, qatorlar ham. Bu biroz g'alati, to'g'rimi?

Mana dastur ishlatilgandan keyin qanday natija oldim:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe…
id java.lang.Integer INT 4
name java.lang.String VARCHAR 12
level java.lang.Integer INT 4
created_date java.sql.Date DATE 91
Process finished with exit code 0
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION