ResultSetExtractor Spring JDBC-তে ব্যবহৃত একটি ইন্টারফেস, যা জটিল SQL কুয়েরি থেকে ডেটা প্রসেস এবং রিটার্ন করার জন্য ব্যবহৃত হয়। এটি এমন ক্ষেত্রে উপযোগী যেখানে ডেটাবেস থেকে রিলেশনাল ডেটা প্রসেস করতে হয় এবং একাধিক টেবিল থেকে ডেটা নিয়ে আসা হয়।
ResultSetExtractor কেন প্রয়োজন?
- কাস্টম ডেটা ম্যাপিং:
- যখন ডেটা অবজেক্টে রূপান্তর করতে জটিল লজিক প্রয়োজন।
- নেস্টেড ডেটা প্রসেসিং:
- নেস্টেড রিলেশনাল ডেটা (যেমন Parent-Child সম্পর্ক) প্রসেস করতে।
- ফ্ল্যাট ResultSet এর বিকল্প:
- যখন একাধিক রেকর্ড বা নেস্টেড ডেটা কাঠামো তৈরি করতে হয়।
ResultSetExtractor এর ব্যবহার
১. ResultSetExtractor ইন্টারফেসের মেথড
T extractData(ResultSet rs) throws SQLException, DataAccessExceptionResultSetথেকে ডেটা প্রসেস করে একটি কাস্টম অবজেক্ট বা ডেটা কাঠামো রিটার্ন করে।
ResultSetExtractor ব্যবহার করার ধাপ
১. ডেটা মডেল তৈরি করা
public class Order {
private int id;
private String customerName;
private List<OrderItem> items;
// Getters, Setters, and Constructor
}
public class OrderItem {
private int id;
private String productName;
private int quantity;
// Getters, Setters, and Constructor
}
২. SQL কুয়েরি লিখুন
SELECT o.id AS order_id, o.customer_name,
i.id AS item_id, i.product_name, i.quantity
FROM orders o
JOIN order_items i ON o.id = i.order_id
WHERE o.id = ?;
৩. ResultSetExtractor ইম্প্লিমেন্টেশন
import org.springframework.jdbc.core.ResultSetExtractor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class OrderResultSetExtractor implements ResultSetExtractor<Order> {
@Override
public Order extractData(ResultSet rs) throws SQLException {
Order order = null;
List<OrderItem> items = new ArrayList<>();
while (rs.next()) {
if (order == null) {
// প্রথম রেকর্ডে অর্ডার অবজেক্ট তৈরি
order = new Order(
rs.getInt("order_id"),
rs.getString("customer_name"),
items
);
}
// প্রতিটি অর্ডার আইটেম প্রসেস
OrderItem item = new OrderItem(
rs.getInt("item_id"),
rs.getString("product_name"),
rs.getInt("quantity")
);
items.add(item);
}
return order;
}
}
৪. JdbcTemplate ব্যবহার করে কুয়েরি চালানো
import org.springframework.jdbc.core.JdbcTemplate;
public class OrderRepository {
private final JdbcTemplate jdbcTemplate;
public OrderRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public Order getOrderById(int orderId) {
String sql = "SELECT o.id AS order_id, o.customer_name, " +
"i.id AS item_id, i.product_name, i.quantity " +
"FROM orders o " +
"JOIN order_items i ON o.id = i.order_id " +
"WHERE o.id = ?";
return jdbcTemplate.query(sql, new OrderResultSetExtractor(), orderId);
}
}
৫. ক্লায়েন্ট কোড
public class MainApp {
public static void main(String[] args) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(/* DataSource Configuration */);
OrderRepository orderRepository = new OrderRepository(jdbcTemplate);
Order order = orderRepository.getOrderById(1);
System.out.println("Order ID: " + order.getId());
System.out.println("Customer Name: " + order.getCustomerName());
System.out.println("Items:");
order.getItems().forEach(item ->
System.out.println(item.getProductName() + " - Quantity: " + item.getQuantity())
);
}
}
ResultSetExtractor এর সুবিধা
- জটিল ডেটা প্রসেসিং:
- নেস্টেড বা মাল্টি-টেবিল ডেটা কুয়েরি সহজে প্রসেস করা যায়।
- কাস্টম ডেটা স্ট্রাকচার:
- একাধিক অবজেক্টে ডেটা ম্যাপ করার সুবিধা।
- একাধিক রেকর্ড হ্যান্ডলিং:
- একাধিক রেকর্ড বা সম্পর্কযুক্ত ডেটা প্রসেস করা সহজ।
ResultSetExtractor এর সীমাবদ্ধতা
- ম্যাপিং লজিক হাতে কোড করতে হয়:
- এটি ম্যানুয়াল কাজ বাড়াতে পারে।
- কমপ্লেক্সিটি:
- খুব জটিল কুয়েরি থাকলে ম্যাপিং লজিক বোঝা কঠিন হতে পারে।
ResultSetExtractor বনাম RowMapper
| Feature | ResultSetExtractor | RowMapper |
|---|---|---|
| ব্যবহার | জটিল ডেটা প্রসেসিং | সাধারণ ফ্ল্যাট ডেটা প্রসেসিং |
| রিটার্ন টাইপ | কাস্টম অবজেক্ট বা স্ট্রাকচার | একক অবজেক্ট বা রেকর্ড লিস্ট |
| কাস্টম লজিক | কাস্টম লজিক লিখা সহজ | সীমিত কাস্টম লজিক |
| নেস্টেড ডেটা | নেস্টেড ডেটা ম্যাপিং সহজ | জটিল ম্যাপিং সম্ভব নয় |
উপসংহার
Spring JDBC-তে ResultSetExtractor জটিল কুয়েরি থেকে ডেটা প্রসেস এবং কাস্টম অবজেক্ট তৈরি করার জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি। এটি বিশেষত নেস্টেড বা সম্পর্কযুক্ত ডেটার ক্ষেত্রে কার্যকর। তবে সাধারণ কাজের জন্য RowMapper সহজতর এবং উপযোগী। ResultSetExtractor ব্যবহার করে ডেটা প্রসেসিং সম্পূর্ণরূপে ডেভেলপারের নিয়ন্ত্রণে থাকে, যা বৃহৎ এবং জটিল অ্যাপ্লিকেশনে সহায়ক।
Read more