Java MySQL-এ ডেটা ফেচ (fetch) করার জন্য ResultSet ব্যবহার করা হয়। যখন SQL কোয়েরি এক্সিকিউট করা হয়, তখন ResultSet অবজেক্টটি ডেটাবেসের থেকে রিটার্ন হওয়া ডেটার সেট ধারণ করে। এটি বিভিন্ন মেথড ব্যবহার করে ডেটা রিড এবং প্রসেস করতে সহায়তা করে।
এখানে, আমরা দেখব কিভাবে ResultSet ব্যবহার করে MySQL ডেটাবেস থেকে ডেটা ফেচ করা যায় এবং কীভাবে এটি Java প্রোগ্রামে ইন্টিগ্রেট করা হয়।
1. ResultSet কী?
ResultSet একটি ইন্টারফেস যা ডেটাবেস কোয়েরি থেকে রিটার্ন হওয়া ডেটা ধারণ করে। এটি একটি টেবিলের মতো কাজ করে এবং একে একে সমস্ত রো (row) এবং কলাম (column) থেকে ডেটা এক্সেস করা যায়।
ResultSet এর প্রধান মেথডগুলো:
- next(): পরবর্তী রেকর্ডে চলে যায়।
- getString(), getInt(), getDouble(), getDate(): বিভিন্ন ডেটা টাইপের মান পড়তে ব্যবহৃত হয়।
- close(): ResultSet অবজেক্ট বন্ধ করতে ব্যবহৃত হয়।
2. ResultSet ব্যবহার করে Data Fetch করার উদাহরণ
নিচে একটি উদাহরণ দেওয়া হয়েছে, যেখানে ResultSet ব্যবহার করে users টেবিল থেকে ডেটা ফেচ করা হচ্ছে।
2.1 Basic Example
import java.sql.*;
public class FetchDataExample {
public static void main(String[] args) {
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// MySQL ডেটাবেসে সংযোগ
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// SQL কোয়েরি তৈরি করা
String sql = "SELECT id, name, age FROM users";
Statement stmt = conn.createStatement();
// কোয়েরি এক্সিকিউট করা এবং ফলাফল সংগ্রহ করা
ResultSet rs = stmt.executeQuery(sql);
// ডেটা ফেচ করা এবং প্রিন্ট করা
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// রিসোর্স বন্ধ করা
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
stmt.executeQuery(sql): এই মেথডটি SQL কোয়েরি এক্সিকিউট করে এবং একটি ResultSet রিটার্ন করে।rs.next(): এই মেথডটি বর্তমান রেকর্ড থেকে পরবর্তী রেকর্ডে চলে যেতে ব্যবহৃত হয়। যখন পরবর্তী রেকর্ড থাকে, তখন এটিtrueরিটার্ন করে।rs.getInt(),rs.getString(): এই মেথডগুলি নির্দিষ্ট কলাম থেকে ডেটা ফেচ করে। এখানেid,name, এবংageকলাম থেকে ডেটা নেওয়া হচ্ছে।
3. ResultSet এর সাথে PreparedStatement ব্যবহার
PreparedStatement ব্যবহার করলে SQL ইনজেকশন থেকে সুরক্ষা নিশ্চিত হয় এবং পারফরম্যান্সে উন্নতি আসে। নিচে PreparedStatement সহ ResultSet ব্যবহার করার উদাহরণ দেওয়া হলো।
import java.sql.*;
public class PreparedStatementFetchExample {
public static void main(String[] args) {
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// MySQL ডেটাবেসে সংযোগ
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// SQL কোয়েরি তৈরি করা (Parameterized Query)
String sql = "SELECT id, name, age FROM users WHERE age > ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// প্লেসহোল্ডারে মান সেট করা
pstmt.setInt(1, 18);
// কোয়েরি এক্সিকিউট করা এবং ফলাফল সংগ্রহ করা
ResultSet rs = pstmt.executeQuery();
// ডেটা ফেচ করা এবং প্রিন্ট করা
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// রিসোর্স বন্ধ করা
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
pstmt.setInt(1, 18): এখানে?প্লেসহোল্ডারের মাধ্যমে ১৮ বয়সের বেশি সকল ইউজারের তথ্য ফেচ করা হয়েছে।pstmt.executeQuery(): PreparedStatement এর মাধ্যমে কোয়েরি এক্সিকিউট করা হয়েছে এবং ফলাফল ResultSet এ পাওয়া গেছে।
4. ResultSet এর ধরন
ResultSet দুই ধরনের হতে পারে:
- TYPE_FORWARD_ONLY: এটি শুধুমাত্র এক দিক থেকে (অর্থাৎ, প্রথম রেকর্ড থেকে শেষ রেকর্ড পর্যন্ত) রেকর্ডগুলিকে এক্সেস করতে পারে। এটি ডিফল্ট ধরনের ResultSet।
- TYPE_SCROLL_INSENSITIVE: এটি রেকর্ডগুলোকে সামনে ও পিছনে গড়িয়ে এক্সেস করতে দেয়, কিন্তু এটি রিয়েল-টাইম পরিবর্তনগুলো দেখায় না।
- TYPE_SCROLL_SENSITIVE: এটি রেকর্ডগুলোকে সামনে ও পিছনে গড়িয়ে এক্সেস করতে দেয় এবং রিয়েল-টাইম পরিবর্তনগুলো দেখায়।
- CONCUR_READ_ONLY: এটি শুধুমাত্র ডেটা পড়তে সক্ষম, ডেটা আপডেট করা যাবে না।
- CONCUR_UPDATABLE: এটি ডেটা পড়া এবং আপডেট করার সুবিধা দেয়।
5. ResultSet এর সাথে Pagination (ডেটা পেজিনেশন)
Pagination ব্যবহার করলে আপনি একটি নির্দিষ্ট পরিমাণ রেকর্ড নিয়ে একাধিক পেজে ডেটা দেখাতে পারেন। MySQL তে LIMIT এবং OFFSET ব্যবহার করে পেজিনেশন করা যায়।
import java.sql.*;
public class PaginationExample {
public static void main(String[] args) {
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// MySQL ডেটাবেসে সংযোগ
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Pagination এর জন্য SQL কোয়েরি তৈরি করা
int page = 1;
int pageSize = 5;
int offset = (page - 1) * pageSize;
String sql = "SELECT id, name, age FROM users LIMIT ? OFFSET ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// প্লেসহোল্ডারে মান সেট করা
pstmt.setInt(1, pageSize);
pstmt.setInt(2, offset);
// কোয়েরি এক্সিকিউট করা এবং ফলাফল সংগ্রহ করা
ResultSet rs = pstmt.executeQuery();
// ডেটা ফেচ করা এবং প্রিন্ট করা
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// রিসোর্স বন্ধ করা
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
LIMIT ? OFFSET ?: পেজিনেশনের জন্যLIMITএবংOFFSETব্যবহৃত হয়েছে, যেখানেpageএবংpageSizeএর মাধ্যমে ডেটার পেজিং করা হচ্ছে।
সারাংশ
Java MySQL-এ ResultSet ব্যবহার করে ডেটা ফেচ করা খুবই সহজ। ResultSet ডেটাবেসের রিটার্ন হওয়া ফলাফল ধারণ করে এবং আপনি বিভিন্ন মেথড যেমন next(), getString(), getInt() ইত্যাদি ব্যবহার করে ডেটা এক্সেস করতে পারেন। PreparedStatement এর মাধ্যমে SQL কোয়েরি এক্সিকিউট করলে SQL ইনজেকশন থেকে সুরক্ষা পাওয়া যায় এবং পারফরম্যান্স উন্নত হয়। আপনি যদি পেজিনেশন চান, তবে LIMIT এবং OFFSET ব্যবহার করে ডেটাকে পেজ করে ফেলতে পারেন।
Read more