Custom ResultSetExtractor তৈরি করা

Spring JDBC এবং ResultSetExtractor - স্প্রিং জেডিবিসি (Spring JDBC) - Java Technologies

271

Spring JDBC-তে ResultSetExtractor একটি ইন্টারফেস, যা ডাটাবেসের ResultSet থেকে কাস্টম অবজেক্ট তৈরি করতে ব্যবহার করা হয়। এটি একাধিক রেকর্ড বা জটিল ডাটা স্ট্রাকচারকে ম্যানিপুলেট করার জন্য কার্যকর।

ResultSetExtractor ব্যবহার তখনই সুবিধাজনক, যখন:

  1. আপনাকে একাধিক টেবিল বা জটিল ডাটা স্ট্রাকচার থেকে ডেটা ম্যাপ করতে হবে।
  2. সাধারণ RowMapper যথেষ্ট না হয়।

ResultSetExtractor ইন্টারফেসের সিগনেচার:

@FunctionalInterface
public interface ResultSetExtractor<T> {
    T extractData(ResultSet rs) throws SQLException, DataAccessException;
}

Custom ResultSetExtractor তৈরির ধাপ

  1. ResultSetExtractor ইন্টারফেস ইমপ্লিমেন্ট করা।
  2. ResultSet থেকে ডেটা প্রসেস করা।
  3. JdbcTemplate এর query() মেথডে ResultSetExtractor ব্যবহার করা।

উদাহরণ

1. সাধারণ টেবিল থেকে ডেটা প্রসেস করা

ধরি, আমাদের একটি টেবিল রয়েছে:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    age INT
);
Custom ResultSetExtractor:
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserResultSetExtractor implements ResultSetExtractor<List<User>> {

    @Override
    public List<User> extractData(ResultSet rs) throws SQLException, DataAccessException {
        List<User> users = new ArrayList<>();

        while (rs.next()) {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            user.setAge(rs.getInt("age"));
            users.add(user);
        }

        return users;
    }
}
JdbcTemplate ব্যবহার:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new UserResultSetExtractor());
    }
}
User ক্লাস:
public class User {
    private int id;
    private String name;
    private String email;
    private int age;

    // Getters and Setters
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", email=" + email + ", age=" + age + "]";
    }
}

2. জটিল স্ট্রাকচার থেকে ডেটা প্রসেস করা

ধরি, আমাদের দুটি টেবিল রয়েছে:

  • users টেবিল:

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100)
    );
    
  • orders টেবিল:

    CREATE TABLE orders (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT,
        order_details VARCHAR(255),
        FOREIGN KEY (user_id) REFERENCES users(id)
    );
    
Custom ResultSetExtractor:
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserOrderResultSetExtractor implements ResultSetExtractor<Map<String, List<String>>> {

    @Override
    public Map<String, List<String>> extractData(ResultSet rs) throws SQLException, DataAccessException {
        Map<String, List<String>> userOrders = new HashMap<>();

        while (rs.next()) {
            String userName = rs.getString("name");
            String orderDetails = rs.getString("order_details");

            userOrders.computeIfAbsent(userName, k -> new ArrayList<>()).add(orderDetails);
        }

        return userOrders;
    }
}
JdbcTemplate ব্যবহার:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class OrderService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Map<String, List<String>> getUserOrders() {
        String sql = "SELECT u.name, o.order_details FROM users u JOIN orders o ON u.id = o.user_id";
        return jdbcTemplate.query(sql, new UserOrderResultSetExtractor());
    }
}

ResultSetExtractor বনাম RowMapper

ফিচারResultSetExtractorRowMapper
ব্যবহারজটিল বা কাস্টম ডেটা স্ট্রাকচার প্রসেস করার জন্য উপযোগী।প্রতিটি রেকর্ড সহজভাবে একটি অবজেক্টে ম্যাপ করতে।
রিটার্ন টাইপএকাধিক রেকর্ড বা জটিল ডেটা স্ট্রাকচার রিটার্ন করতে পারে।সাধারণত একটি রেকর্ডের অবজেক্ট রিটার্ন করে।
প্রসেসিংResultSet সম্পূর্ণ প্রসেস করার স্বাধীনতা দেয়।প্রতিটি রেকর্ড প্রসেস করে।

উপসংহার

Spring JDBC-এর ResultSetExtractor জটিল ডেটা প্রসেস করার জন্য একটি অত্যন্ত কার্যকর টুল। যদি আপনার ডাটাবেস স্ট্রাকচার জটিল হয় বা একাধিক টেবিলের সাথে কাজ করতে হয়, তাহলে ResultSetExtractor ব্যবহার করে আপনি সহজেই ডেটা প্রসেস করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...