বর্তমান লাইন পরিচালনা

আমরা প্রথম প্রোগ্রাম লিখেছিলাম এবং এটি পুরোপুরি কাজ করে। আমরা একটি প্রশ্ন লিখেছি, এটি কার্যকর করেছি এবং ফলস্বরূপ, executeQuery() পদ্ধতিটি আমাদের কাছে একটি বস্তু ফিরিয়ে দিয়েছেফলাফল সেটএকটি যে কোয়েরির সমস্ত ফলাফল ধারণ করে। এবং এখন আমরা এটি থেকে এই ফলাফলগুলি কীভাবে পেতে পারি তা বের করার চেষ্টা করব।

ক্যোয়ারী ফলাফলে হাজার হাজার সারি এবং বিভিন্ন ধরণের শত শত কলাম থাকতে পারে, তাই এটি আপনার মনে হতে পারে এমন তুচ্ছ কাজ নয়। উদাহরণস্বরূপ, ছবিগুলি ডাটাবেসে সংরক্ষণ করা যেতে পারে, তারপরে আপনি বাইটের একটি সেট বা এটি ডাউনলোড করার জন্য একটি ইনপুটস্ট্রিম হিসাবে একটি ছবি পেতে পারেন।

তবে আমরা সবচেয়ে সহজ দিয়ে শুরু করব - " বর্তমান ফলাফল লাইন " ধারণা দিয়ে । যেহেতু ফলাফলে সাধারণত অনেক সারি থাকে, বস্তুটিফলাফল সেটভিতরে বর্তমান লাইন একটি পয়েন্টার আছে. এবং পরবর্তী() পদ্ধতি ব্যবহার করে ক্রমানুসারে লাইনগুলিকে পড়ার জন্য সুইচ করে ।

এই পদ্ধতিটি প্রাথমিকভাবে অপ্টিমাইজেশনের জন্য করা হয়। JDBC ড্রাইভার ডাটাবেস থেকে স্ট্রিংগুলি লোড নাও করতে পারে যতক্ষণ না আপনি ক্রমানুসারে সেগুলি পড়তে পারেন৷ আপনিও শুরু থেকে শেষ পর্যন্ত ক্রমানুসারে FileInputStream পড়ুন। সুতরাং এই পদ্ধতিটি আপনার কাছে পরিচিত এবং বোধগম্য হওয়া উচিত।

যাইহোক, আপনার যদি সত্যিই এটির প্রয়োজন হয়, তাহলে RandomAccessFile ক্লাস ব্যবহার করে ফাইলগুলি যে কোনও জায়গায় পড়া যেতে পারে ।

ResultSet ক্লাসটিও অনুরূপ কিছু করার অনুমতি দেয় এবং আপনাকে ফলাফলের সাথে বর্তমান সারিটি কোথাও সরাতে দেয়। এটি করার জন্য, এটি নিম্নলিখিত পদ্ধতি আছে:

পদ্ধতি বর্ণনা
1 পরবর্তী() পরবর্তী লাইনে স্যুইচ করুন
2 আগে() আগের লাইনে স্যুইচ করুন
3 isFirst() বর্তমান লাইন প্রথম?
4 isBeforeFirst() আমরা কি প্রথম লাইনের সামনে আছি?
5 isLast() বর্তমান লাইন কি শেষ?
6 isAfterLast() আমরা কি সময়সীমার পরে?
7 পরম (int n) Nth লাইনকে বর্তমান করে
8 আপেক্ষিক (int n) বর্তমান লাইন N অবস্থানগুলিকে এগিয়ে নিয়ে যায়। N <0 হতে পারে
9 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 ডেটা প্রকার এবং ফলাফল সেট পদ্ধতিগুলি সংযুক্ত করতে সহায়তা করবে:

এসকিউএল ডেটা টাইপ getXXX() পদ্ধতি
CHAR getString()
ভার্চার getString()
আইএনটি getInt()
ভাসা getDouble()
CLOB getClob()
BLOB getBlob()
তারিখ getDate()
টাইম সময় পেতে()
টাইমস্ট্যাম্প getTimestamp()

বিন্দু, আমি মনে করি আপনি এটি পেতে.

ResultSet সম্পর্কে বিভিন্ন তথ্য পাওয়া

আমরা বর্তমান লাইন থেকে ডেটা কীভাবে পড়তে হয় তা খুঁজে বের করেছি: কলাম নম্বর এবং এর নাম দ্বারা। যাইহোক, আমি কিভাবে তার নম্বর দ্বারা কলামের নাম খুঁজে পেতে পারি? নাকি ফলাফলে কলামের সংখ্যা কত?

একদিকে, আপনি যদি একটি অনুরোধ লিখেন, তবে আপনাকে এই সমস্ত কিছু জানতে হবে বলে মনে হয়। অন্যদিকে, আমরা এমন একটি প্রোগ্রাম লিখতে পারি যা স্ক্রিনে একটি প্রশ্নের ফলাফল প্রদর্শন করে: ক্যোয়ারীটি আমাদের কাছে পাঠানো হয়েছে এবং আমরা শুধু এসকিউএল সার্ভার যা ফিরিয়ে দিয়েছে তা স্ক্রিনে (কনসোলে, ওয়েব পৃষ্ঠায়) প্রদর্শন করতে চাই। আমাদেরকে.

JDBC এর জন্য একটি বিশেষ বস্তু রয়েছে, ResultSetMetaData ইন্টারফেস । এই ধরনের একটি বস্তু পাওয়া বেশ সহজ:

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

ResultSetMetaData ইন্টারফেসের কিছু খুব আকর্ষণীয় পদ্ধতি রয়েছে। নীচে সবচেয়ে জনপ্রিয় হল:

1 getColumnCount() ফলাফল কলামের সংখ্যা প্রদান করে
2 getColumnName(int কলাম) কলামের নাম প্রদান করে
3 getColumnLabel(int কলাম) কলামের বর্ণনা প্রদান করে
4 getColumnType() কলামের ধরন প্রদান করে: নম্বর (বিশেষ কোড)
5 getColumnTypeName() কলামের ধরন প্রদান করে: স্ট্রিং
6 getColumnClassName() কলামের প্রকারের জন্য জাভা শ্রেণীর নাম প্রদান করে
7 getTableName() টেবিলের নাম প্রদান করে
8 getCatalogName() কলামের ডিরেক্টরির নাম প্রদান করে
9 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 আইএনটি 4
নাম java.lang.string ভার্চার 12
স্তর java.lang.Integer আইএনটি 4
তৈরীর তারিখ java.sql.date তারিখ 91
প্রস্থান কোড 0 দিয়ে প্রক্রিয়া শেষ হয়েছে